【发布时间】:2014-09-10 20:16:55
【问题描述】:
我有一个ViewPager,里面有Fragments。我想以编程方式创建一个运动事件以“窥视”ViewPager 中的当前Fragment 左右的Fragment(显示部分相邻片段,然后移回当前Fragment) .它应该看起来像一个用户正在这样做。
我试过ViewPager.fakeDragBy 但这会立即发生并且太快了。
我看了一下MotionEvent.obtain() 和View.dispatchTouchEvent,这似乎是这样做的方法,对吧?
我必须在哪个View 上发送MotionEvents?
我是否必须手动分派几个MotionEvents 才能实现我想要的,例如ACTION_DOWN, ACTION_???, ACTION_UP?
编辑:
我尝试了以下方法:
public void drag(View view, float fromX, float toX, float fromY,
float toY, int stepCount) {
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
float y = fromY;
float x = fromX;
float yStep = (toY - fromY) / stepCount;
float xStep = (toX - fromX) / stepCount;
MotionEvent event = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_DOWN, x, y, 0);
view.dispatchTouchEvent(event);
for (int i = 0; i < stepCount; ++i) {
y += yStep;
x += xStep;
eventTime = SystemClock.uptimeMillis();
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 0);
view.dispatchTouchEvent(event);
}
eventTime = SystemClock.uptimeMillis();
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0);
view.dispatchTouchEvent(event);
}
这可以很好地创建拖动动作,但问题是:它非常快。我在循环中尝试了Thread.sleep() 并使用了eventTime(在for 循环中的每次迭代中添加一些时间),但无济于事:触摸事件被延迟发送,但ViewPager 的实际反应仍然发生得很快。
【问题讨论】:
-
没有。您需要多次调用 fakeDragBy,例如 Handler 的最佳工作
-
谢谢,但这并没有真正起作用。它应该看起来像用户会慢慢地做这个动作。
-
你试过我的实现了吗? stackoverflow.com/a/25476109/2158970
-
@Yuraj 是的,它工作得很好。非常感谢!