通过编程模拟平滑的阻力事件



我使用了自定义draglinearearout。我使用addDragView()添加的所有孩子都是可拖动的(用户互动)。
我想模拟拖动事件以单击视图(平稳移动到布局的底部)。

ACTION_DOWN -> ACTION_MOVE -> ACTION_UP

我尝试了此代码,但它不起作用。

long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
float x = view.getLeft();
float y = view.getTop();
int metaState = 0;
MotionEvent downEvent = MotionEvent.obtain(
                            downTime,
                            eventTime + 1000,
                            MotionEvent.ACTION_DOWN,
                            x,
                            y,
                            metaState
                    );
view.dispatchTouchEvent(downEvent);
MotionEvent moveEvent = MotionEvent.obtain(
                            downTime,
                            eventTime + 1000,
                            MotionEvent.ACTION_MOVE,
                            x,
                            y + 300,
                            metaState
                    );
view.dispatchTouchEvent(moveEvent);
MotionEvent upEvent = MotionEvent.obtain(
                            downTime,
                            eventTime + 1001,
                            MotionEvent.ACTION_UP,
                            x,
                            y + 300,
                            metaState
                    );
view.dispatchTouchEvent(upEvent);

我遇到了同样的问题,我必须模拟listView到Overscroll。

经过一些调整后,我成功完成了工作。

这是我所做的:(overScrollDown()是我的自定义列表视图中的一个函数)

您可以在此要点中看到细节。还有屏幕截图

public void overScrollDown() {
    post(new Runnable() {
        @Override
        public void run() {
            final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_DOWN, getWidth() / 2, getHeight() / 2, 0);
            dispatchTouchEvent(event);
            event.recycle();
        }
    });
    postDelayed(new Runnable() {
        @Override
        public void run() {
            final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_MOVE, getWidth() / 2, getHeight() / 2, 0);
            dispatchTouchEvent(event);
            event.recycle();
        }
    }, 50);
    postDelayed(new Runnable() {
        @Override
        public void run() {
            final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_MOVE, getWidth() / 2, getHeight() / 2 + 400, 0);
            dispatchTouchEvent(event);
            event.recycle();
        }
    }, 100);
    postDelayed(new Runnable() {
        @Override
        public void run() {
            final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_UP, getWidth() / 2, getHeight() / 2 + 400, 0);
            dispatchTouchEvent(event);
            event.recycle();
        }
    }, 3000);
}

顺便说一句。向下滚动操作可以通过更多的ACTION_MOVE事件流畅。

最新更新