ONInterceptTouchEvent 时丢失 ACTION_DOWN 个参数

Losing ACTION_DOWN parameters when InterceptTouchEvent

我有一个应该跟随手指触摸的父视图和一个可点击的子视图。所以我使用 onInterceptTouchEvent 通过比较 ACTION_UP 之前的触摸距离来决定是否必须在父级或子级上消耗触摸事件。

显然我在 onInterceptTouchEvent 的 ACTION_DOWN 上使用了 "retrun false" (因为在计算之前传播事件还为时过早)所以不幸的是 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;
}

这是在对象外部定义的 ontouch(与程序内联)

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

只是让你开始接触你的activity。 (我知道它不完美但看起来还可以)。

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

// 之后只需从 activity 调用 getStartX()。