2016-11-22 9 views
2

私はカスタムDragLinearLayoutを使用しました。 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); 
+0

解決策はありますか? – Gohan

答えて

0

私は同じ問題を抱えていましたが、私はリストビューをオーバースケールにシミュレートしなければなりませんでした。

少し微調整した後、私は正常に作業を行いました。ここで

は私がやったことです:あなたはこのgistで、ここで詳細を見ることができます

overScrollDown()マイカスタムリストビュー内の関数です)。また、screencast

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); 
} 

Btw。スクロールダウン操作はスムーズになりますACTION_MOVEイベント..

関連する問題