我的活动中有一个按钮网格。当用户在这个按钮网格上滑动手指时,我希望所有触摸的按钮都被记录下来,因此我知道触摸了哪些按钮。
我一直在研究这个,我不知道如何做到这一点,因为大多数例子都是使用Bitmaps。它所选择的第一个视图是我OnTouchListener
中唯一选择的视图。从我的阅读材料中可以看出,MotionEvent.ACTION_MOVE
是用于此的内容,我看到有人说要使用view.getRawX()
和view.getRawY()
,但我不明白这将如何用于确定按下其他按钮,当用户在屏幕上滑动手指时不按下按钮。
我是Android的新手,所以我很抱歉,如果这比我想象的要简单得多。任何输入都会非常感激,因为我不认为这应该是如此复杂。感谢您的时间! :)
答案 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;
}
适用于多点触控