【问题标题】:Create fake drag event to move ViewPager around创建假拖动事件以移动 ViewPager
【发布时间】: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 是的,它工作得很好。非常感谢!

标签: android android-viewpager


【解决方案1】:

你可以这样做:

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

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

onAnimationEnd()

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

【讨论】:

    【解决方案2】:

    第一种方式

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

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


    第二种方式

    使用带有自定义属性的 Object animator 并在其中使用您的 fakeDrag 方法并像普通动画一样运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2019-06-13
      相关资源
      最近更新 更多