创建假拖动事件以移动ViewPager

时间:2014-09-03 10:44:05

标签: android android-viewpager

我有一个ViewPager,其中包含Fragment个。我想以编程方式创建一个动作事件,以Fragment向左和向右Fragment显示ViewPager中的当前Fragment(显示相邻片段的一部分,然后移回当前ViewPager.fakeDragBy)。它应该看起来像用户这样做。

我尝试了MotionEvent.obtain(),但这种情况立即发生,而且速度太快了。 我看了View.dispatchTouchEventView,这似乎是要做到这一点的方法,对吧?

我需要MotionEvents发送MotionEvent吗? 我是否必须手动调度多个ACTION_DOWN来实现我想要的,例如ACTION_???ACTION_UPpublic 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()

这样可以很好地创建拖动动作,问题是:它非常快。我在循环中尝试ViewPager并使用eventTime(在for循环中的每次迭代中为它添加一些时间),但无济于事:触发事件被调度延迟,但是实际的反应{ {1}}仍然非常快。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

if (!viewpager.isFakeDragging()) {
    viewpager.beginFakeDrag();
}
viewpager.fakeDragBy(value);

文档: fakeDragBy(float)beginFakeDrag()endFakeDrag()

并在onAnimationEnd()

@Override
public void onAnimationEnd(Animator mAnimation) {
    viewpager.endFakeDrag();
}

答案 1 :(得分:1)

第一路

OverScroller对象与LinearInterpolator一起使用并设置持续时间(可能在300毫秒内从x1到x2)

在for循环中调用computeScrollOffset()以查找当前位置,并在isFinished()返回true时中断循环。


第二路

将Object animator与自定义属性一起使用,并在其中使用fakeDrag方法并像普通动画一样运行它。