在android中等待多点触摸输入
我正在尝试做一个多点触摸应用程序。其动机是编写一个盲文应用程序,它将能够阅读盲文 我用盲文作为参考 以下是代码段:在android中等待多点触摸输入,android,multi-touch,Android,Multi Touch,我正在尝试做一个多点触摸应用程序。其动机是编写一个盲文应用程序,它将能够阅读盲文 我用盲文作为参考 以下是代码段: @Override public boolean onTouchEvent(MotionEvent event) { // get pointer index from the event object int pointerIndex = event.getActionIndex(); // get pointer ID
@Override
public boolean onTouchEvent(MotionEvent event) {
// get pointer index from the event object
int pointerIndex = event.getActionIndex();
// get pointer ID
int pointerId = event.getPointerId(pointerIndex);
// get masked (not specific to a pointer) action
int maskedAction = event.getActionMasked();
switch (maskedAction & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN: {
// We have a new pointer. Lets add it to the list of pointers
PointF f = new PointF();
f.x = event.getX(pointerIndex);
f.y = event.getY(pointerIndex);
mActivePointers.put(pointerId, f);
parseBraille();
break;
}
case MotionEvent.ACTION_MOVE: { // a pointer was moved
for (int size = event.getPointerCount(), i = 0; i < size; i++) {
PointF point = mActivePointers.get(event.getPointerId(i));
if (point != null) {
point.x = event.getX(i);
point.y = event.getY(i);
}
}
break;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL: {
mActivePointers.remove(pointerId);
break;
}
}
invalidate();
return true;
}
private void showMsg(String msg){
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
private void parseBraille(){
if (mActivePointers.size() == 1){
showMsg("a");
}
else if (mActivePointers.size() == 2){
double x0 = mActivePointers.get(0).x;
double y0 = mActivePointers.get(0).y;
double x1 = mActivePointers.get(1).x;
double y1 = mActivePointers.get(1).y;
if (Math.abs(mActivePointers.get(0).x - mActivePointers.get(1).x) < 50){
showMsg("b");
}
}
}
@覆盖
公共布尔onTouchEvent(运动事件){
//从事件对象获取指针索引
int pointerIndex=event.getActionIndex();
//获取指针ID
int pointerId=event.getPointerId(pointerIndex);
//获取掩码(不特定于指针)操作
int maskedAction=event.getActionMasked();
开关(maskedAction和MotionEvent.ACTION\u MASK){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:{
//我们有一个新指针。让我们把它添加到指针列表中
PointF=新的PointF();
f、 x=event.getX(pointerIndex);
f、 y=event.getY(pointerIndex);
mActivePointers.put(pointerId,f);
解析盲文();
打破
}
case MotionEvent.ACTION_MOVE:{//指针已移动
对于(int size=event.getPointerCount(),i=0;i
这里发生的事情是,当我用两个手指触摸时,我想得到“b”作为回应,但我得到“a”是因为第一个手指,然后是“b”
如何解决此问题?您将一次获得一个触摸事件,因此需要修改您的方法。我看到两种解决方案:(1)触摸后,等待给定的时间,以防用户按下另一个手指,或(2)使用首次启动事件,然后收集所有手指以确定合适的字母。您可以使用两种不同的方法来解决此问题:
ACTION\u DOWN
到ACTION\u UP
记录您收到的所有MotionEvent
MotionEvent
实例识别手势代码中的问题是,您试图识别
操作指针向下
事件中的手势(方法parseBraille
)。每当用户在触摸屏上按手指时,也会触发此事件。在那一刻,你将无法识别这个手势。您必须等待手势结束。对于盲文,必须有平行触摸,因此如何使用up事件?你能提供一个例子吗?我没有真正有用的代码,但我的基本想法是,在一个关闭事件中,任何字母都被认为是暂定的,在这里,你可能希望显示它以方便用户,但主要是保存它以备以后使用。当你得到ActuoToPUP事件时,你会认为它是官方的。换句话说,parseBraille()不显示字母,而是将其保存在一个变量中,然后在操作中从变量中获取字母并将其发送到showMsg()。在实际操作中,这是可能的,但是您必须担心多个事件。