Android dispatchTouchEvent не запускает ACTION_MOVE и ACTION_UP - PullRequest
0 голосов
/ 09 мая 2020

Привет, у меня есть RecyclerView, на котором я установил onItemLongClickListener внутри своего фрагмента.

Я создаю новый TextView, который я хочу переместить после того, как пользователь двигает пальцем.

    adapter.setOnItemLongClickListener(new ProjectTaskAdapter.OnItemLongClickListener() {
        @Override
        public void onLongClick(View v ) {

            TextView tv = new TextView(getActivity());

            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(200, 200);

            tv.setOnTouchListener(new ChoiceTouchListener());

            int metaState = 0;
            long downTime = SystemClock.uptimeMillis();
            long eventTime = SystemClock.uptimeMillis() + 100;

            int[] originalPos = new int[2];
            v.getLocationInWindow(originalPos);

            MotionEvent motionEvent = MotionEvent.obtain(
                    downTime, eventTime,
                    MotionEvent.ACTION_DOWN,
                    originalPos[0], originalPos[1],
                    metaState
            );

            layoutParams.topMargin = originalPos[1] ;
            layoutParams.leftMargin = originalPos[0];

            tv.setLayoutParams(layoutParams);

            rootLayoutPlan.addView(tv);

            tv.dispatchTouchEvent(motionEvent);
        }
    });

Я пытаюсь вызвать с помощью метода dispatchTouchEvent следующий ChoiceTouchListener:

    public final class ChoiceTouchListener implements View.OnTouchListener{

    public boolean onTouch(View view, MotionEvent event){

        final int X = (int) ((int) event.getRawX());
        final int Y = (int) ((int) event.getRawY());

        switch(event.getAction() & MotionEvent.ACTION_MASK){

            case MotionEvent.ACTION_DOWN:
                RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();

                _xDelta = X - lParams.leftMargin;
                _yDelta = Y - lParams.topMargin;
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                layoutParams.leftMargin = X -_xDelta;
                layoutParams.topMargin = Y - _yDelta;

                view.setLayoutParams(layoutParams);

                break;

        }
        rootLayoutPlan.invalidate();

        return true;
    }
}

Проблема в том, что когда я отправляю TouchEvent, он не запускает ACTION_MOVE или ACTION_UP, даже если пользователь двигает пальцем после того, как он долго щелкнул элемент RecyclerView.

Когда я снова нажимаю на новый созданный TextView и двигаю пальцем, все работает, как ожидалось.

Возможно ли, что метод отправки также запускает ACTION_MOVE или Кто-нибудь знает другой способ добиться того же результата?

...