android 滑动过程 触发,android 代码实现模拟用户点击、滑动等操作

/**

* 模拟用户点击

*

* @param view 要触发操作的view

* @param x 相对于要操作view的左上角x轴偏移量

* @param y 相对于要操作view的左上角y轴偏移量

*/

private static void analogUserClick(View view, float x, float y) {

if (view == null) {

return;

}

LogUtil.e(TAG_POINT, "正在模拟点击操作:p->" + x + "," + y);

long downTime = SystemClock.uptimeMillis();//模拟按下去的时间

long eventTime = downTime;//事件发生时间

MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime,

ACTION_DOWN, x, y, 0);

view.onTouchEvent(downEvent);

eventTime = eventTime + 90;//离开屏幕时间

MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime,

MotionEvent.ACTION_UP, x, y, 0);

view.onTouchEvent(upEvent);

//回收事件

downEvent.recycle();

upEvent.recycle();

}

/**

* 模拟用户滑动操作

*

* @param view 要触发操作的view

* @param type 模拟操作类型:均匀滑动、快速滑动

* @param p1x 滑动的起始点x坐标

* @param p1y 滑动的起始点y坐标

* @param p2x 滑动的终点x坐标

* @param p2y 滑动的终点y坐标

*/

private static void analogUserScroll(View view, final int type, final float p1x, final float p1y, final float p2x, final float p2y) {

LogUtil.e(TAG_POINT, "正在模拟滑屏操作:p1->" + p1x + "," + p1y + ";p2->" + p2x + "," + p2y);

if (view == null) {

return;

}

long downTime = SystemClock.uptimeMillis();//模拟按下去的时间

long eventTime = downTime;

float pX = p1x;

float pY = p1y;

int speed = 0;//快速滑动

float touchTime = 116;//模拟滑动时发生的触摸事件次数

//平均每次事件要移动的距离

float perX = (p2x - p1x) / touchTime;

float perY = (p2y - p1y) / touchTime;

boolean isReversal = perX < 0 || perY < 0;//判断是否反向:手指从下往上滑动,或者手指从右往左滑动

boolean isHandY = Math.abs(perY) > Math.abs(perX);//判断是左右滑动还是上下滑动

if (type == USER_TOUCH_TYPE_1) {//加速滑动

touchTime = 10;//如果是快速滑动,则发生的触摸事件比均匀滑动更少

speed = isReversal ? -20 : 20;//反向移动则坐标每次递减

}

//模拟用户按下

MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime,

ACTION_DOWN, pX, pY, 0);

view.onTouchEvent(downEvent);

//模拟移动过程中的事件

List moveEvents = new ArrayList<>();

boolean isSkip = false;

for (int i = 0; i < touchTime; i++) {

pX += (perX + speed);

pY += (perY + speed);

if ((isReversal && pX < p2x) || (!isReversal && pX > p2x)) {

pX = p2x;

isSkip = !isHandY;

}

if ((isReversal && pY < p2y) || (!isReversal && pY > p2y)) {

pY = p2y;

isSkip = isHandY;

}

eventTime += 20.0f;//事件发生的时间要不断递增

MotionEvent moveEvent = getMoveEvent(downTime, eventTime, pX, pY);

moveEvents.add(moveEvent);

view.onTouchEvent(moveEvent);

if (type == USER_TOUCH_TYPE_1) {//加速滑动

speed += (isReversal ? -70 : 70);

}

if (isSkip) {

break;

}

}

//模拟手指离开屏幕

MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime,

MotionEvent.ACTION_UP, pX, pY, 0);

view.onTouchEvent(upEvent);

//回收触摸事件

downEvent.recycle();

for (int i = 0; i < moveEvents.size(); i++) {

moveEvents.get(i).recycle();

}

upEvent.recycle();

}

原文:http://www.cnblogs.com/agilezhu/p/7196940.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想在Android应用程序中模拟`dispatchTouchEvent`但是您发现即使移动了很短的距离,也没有触发滑动事件,那么您可能需要检查以下几: 1. 您正在模拟的事件是否为触摸事件 只有触摸事件才能触发滑动事件,如果您正在模拟的是其他类型的事件,例如按下或释放事件,那么它们不会触发滑动事件。 2. 触摸事件是否被正确处理 您需要确保您的应用程序正确处理了触摸事件。如果您的应用程序没有正确处理触摸事件,则不会触发滑动事件。您可以在代码中检查是否有任何逻辑错误或其他问题。 3. 您移动的距离是否足够长 滑动事件通常需要移动一定的距离才能触发。如果您的移动距离太短,则可能不会触发滑动事件。您可以尝试增加移动距离以查看是否会触发滑动事件。 4. 触摸事件是否在正确的View上分发 您需要确保触摸事件在正确的View上分发。如果您的事件被错误地分发到其他View上,则可能不会触发滑动事件。您可以在代码中检查事件分发的逻辑以确保事件被正确地分发到目标View上。 希望这些提示可以帮助您找到问题所在并解决问题。 ### 回答2: 在Android模拟dispatchTouchEvent事件时,如果手指在屏幕上的滑动距离很短,即没有产生明显的滑动效果,可能有以下几种情况: 首先,可能是由于手指接触屏幕的时间非常短暂,无法产生连续的触摸事件,导致无法触发滑动操作Android系统通过一系列的手势识别算法来判断用户的触摸行为,如果触摸时间过短,系统可能会将其判定为点击事件,而非滑动事件。 其次,可能是由于滑动距离实际上并不足够大,无法满足系统设置的滑动阈值。Android系统为了提升用户体验,在滑动操作识别时会设置一个最小滑动距离阈值。如果手指的滑动距离不超过该阈值,系统将不会将其判定为滑动操作。 另外,也可能是在模拟dispatchTouchEvent事件时出现了问题。dispatchTouchEvent是Activity或View的一个方法,用于分发触摸事件。如果模拟的事件没有正确地传递给相应的View或没有正确处理,那么滑动操作可能无法生效。 总之,在Android模拟dispatchTouchEvent事件并期望实现滑动效果时,需要注意手指接触屏幕的时间、滑动距离是否满足系统要求,以及正确处理触摸事件的传递和处理。 ### 回答3: 当Android模拟`dispatchTouchEvent`时,如果距离很短且没有滑动,可以有以下原因。 首先,可能是因为滑动的距离确实很短,无法引发滑动事件。Android滑动事件通常是通过触摸屏幕的开始和结束之间的水平或垂直位移来判断是否发生滑动。如果滑动的位移非常小,可能不足以被视为滑动事件。 其次,可能是因为`dispatchTouchEvent`方法的使用不正确或被其他代码截断或修改。在Android中,`dispatchTouchEvent`是一个用于分发触摸事件的方法,该方法被调用后会依次经过Activity、ViewGroup以及View等组件,并在这些组件中执行相应的触摸事件方法。如果在这个过程中,`dispatchTouchEvent`方法被其他代码修改或截断,可能会导致滑动事件的距离不正确。 另外,也有可能是因为滑动事件的处理逻辑有误。在`dispatchTouchEvent`方法中,会涉及到对触摸事件的处理和分发,以及相应的滑动逻辑。如果滑动事件的处理逻辑有误,可能导致滑动事件无法正确触发。 总之,要解决Android模拟`dispatchTouchEvent`距离很短且没有滑动的问题,首先需要确保滑动距离足够大以被识别为滑动事件。其次,需要检查`dispatchTouchEvent`方法的使用是否正确,并确保没有被其他代码截断或修改。最后,需要检查滑动事件的处理逻辑是否正确,以确保滑动事件能够正确触发和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值