Потеря параметров ACTION_DOWN при InterceptTouchEvent

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

очевидно, я использовал «rerun false» для ACTION_DOWN в onInterceptTouchEvent (потому что слишком рано распространять событие перед вычислениями). К сожалению, onTouch теряет ACTION_DOWN.

Вопрос в том, как я могу инициализировать параметры (а также начальное положение родительского представления) из onTouch (не из onInterceptTouchEvent)?

Сноска: по какой-то причине мне приходится писать onTouch в ряд с другими кодами, где я реализовал onInterceptTouchEvent внутри определения объекта.

часть определения объекта:

boolean mmIsBeingDragged; 
float mLastX;
float mStartX;
int mTouchSlop=ViewConfiguration.get(getContext()).getScaledTouchSlop();

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mLastX = event.getX();
            mStartX = mLastX;
           break;

        case MotionEvent.ACTION_MOVE:
            float x = event.getX();
            float y = event.getY();
            float xDelta = Math.abs(x - mLastX);

            float xDeltaTotal = x - mStartX;
            if (Math.abs(xDeltaTotal) > mTouchSlop) {
                mmIsBeingDragged = true;
                mStartX = x;
                return true;
            }
            break;

        case MotionEvent.ACTION_CANCEL:

        case MotionEvent.ACTION_UP:
            mmIsBeingDragged = false;
            break;
    }
     return false;
}

и это онтач, который определен вне объекта (встроен в программу)

    myview.setOnTouchListener(new OnTouchListener() 
    {
        float curX=0;
        float oldX;
        float startX;
        float delta=0;
        float togo;
        boolean mIsBeingDragged=false;
        int mTouchSlop=ViewConfiguration.get(getActivity()).getScaledTouchSlop();

        @Override 
        public boolean onTouch(final View v, MotionEvent event) 
        {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            //Here is the prblem! How to initialize startX?

            case MotionEvent.ACTION_MOVE:

                curX = event.getRawX();
                delta=curX-startX;
                togo=oldX+delta;

                if (Math.abs(delta) > mTouchSlop) {
                    mIsBeingDragged=true;
                    followfingerFunction(v,togo)
                    return true;
                }
                break;

                case MotionEvent.ACTION_UP:
                    if (!mIsBeingDragged){v.performClick();}
                break;
        }
            return true;
    }
    });

person Ali Sheikhpour    schedule 29.02.2016    source источник
comment
Итак, дочернее представление имеет набор OnTouchListener, а родительское представление имеет пользовательскую реализацию onInterceptTouchEvent?   -  person Tin Tran    schedule 13.06.2016
comment
Нет. Оба эти определения относятся к родительскому объекту. onInterceptTouchEvent определяется в определении родительского объекта, а OnTouchListener добавляется к родительскому объекту вместе с другими кодами после расширения.   -  person Ali Sheikhpour    schedule 15.06.2016
comment
Я предоставил свой ответ. Пожалуйста, проверьте. Это довольно просто, но я думаю, что это работает   -  person Tin Tran    schedule 16.06.2016


Ответы (1)


Просто откройте mStartX для своей активности. (Я знаю, что это не идеально, но кажется, что все в порядке).

class ParentView extends ViewGroup (or some other viewGroup) {
    int startX;
    public int getStartX(){
        return startX;
    }
}

// После этого просто вызовите getStartX() из вашей активности.

person Tin Tran    schedule 14.06.2016