OnTouchListener MotionEvent.ACTION_MOVE:仅获取第一个视图

时间:2013-05-01 03:21:03

标签: android ontouchlistener

我的活动中有一个按钮网格。当用户在这个按钮网格上滑动手指时,我希望所有触摸的按钮都被记录下来,因此我知道触摸了哪些按钮。

我一直在研究这个,我不知道如何做到这一点,因为大多数例子都是使用Bitmaps。它所选择的第一个视图是我OnTouchListener中唯一选择的视图。从我的阅读材料中可以看出,MotionEvent.ACTION_MOVE是用于此的内容,我看到有人说要使用view.getRawX()view.getRawY(),但我不明白这将如何用于确定按下其他按钮,当用户在屏幕上滑动手指时不按下按钮。

我是Android的新手,所以我很抱歉,如果这比我想象的要简单得多。任何输入都会非常感激,因为我不认为这应该是如此复杂。感谢您的时间! :)

2 个答案:

答案 0 :(得分:2)

一旦您的视图返回true表示它正在使用触摸事件,则其余视图将无法接收该视图。你可以做的是制作一个自定义ViewGroup(你说你有一个网格,我只是假设GridView?)拦截和处理所有触摸事件:

public class InterceptingGridView extends GridView {
    private Rect mHitRect = new Rect();

    public InterceptingGridView (Context context) {
        super(context);
    }

    public InterceptingGridView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent (MotionEvent ev) {
        //Always let the ViewGroup handle the event
        return true;
    }

    @Override
    public boolean onTouchEvent (MotionEvent ev) {
        int x = Math.round(ev.getX());
        int y = Math.round(ev.getY());

        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.getHitRect(mHitRect);

            if (mHitRect.contains(x, y)) {
                /*
                 * Dispatch the event to the containing child. Note that using this
                 * method, children are not guaranteed to receive ACTION_UP, ACTION_CANCEL,
                 * or ACTION_DOWN events and should handle the case where only an ACTION_MOVE is received.
                 */
                child.dispatchTouchEvent(ev);
            }
        }

        //Make sure to still call through to the superclass, so that
        //the ViewGroup still functions normally (e.g. scrolling)
        return super.onTouchEvent(ev);
    }
}

您选择如何处理事件取决于您需要的逻辑,但重要的是让容器视图消耗所有触摸事件,并让它处理将事件分派给子项。

答案 1 :(得分:0)

也许这会对你有所帮助:

    @Override
public boolean onTouch(View v, MotionEvent event) {

        int action = event.getAction() & MotionEvent.ACTION_MASK;
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        int pointerId = event.getPointerId(pointerIndex);


        switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:

            break;

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:

            break;

        case MotionEvent.ACTION_MOVE:
            int pointerCount = event.getPointerCount();
            for (int i = 0; i < pointerCount; i++) {

            }
            break;
        }

        return true;

}

适用于多点触控