InterceptTouchEvent时丢失ACTION_DOWN参数

时间:2016-02-29 03:53:36

标签: android ontouchevent intercept

我有一个父视图,它应该跟随手指触摸并且其中的子视图是可点击的。所以我使用 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;
    }
    });

1 个答案:

答案 0 :(得分:0)

只需将您的mStartX公开给您的活动即可。 (我知道它不完美,但似乎没问题)。

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

//之后只需从您的活动中调用getStartX()。