触摸事件问题 Android

3

我对OnTouchEvent感到沮丧。我想要检测5个手指,该怎么做?另外问题是它会多次调用。这是我的代码:

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub

    int pointerCount = event.getPointerCount();

    System.out.println("My pointer....." + pointerCount);

    final int action = event.getAction();

       if(action == MotionEvent.ACTION_UP) {

           if(pointerCount >= 4){


           Log.d("MyActivity", "in onTouchEvent!");
          Toast.makeText(MyclassActivity.this, "Finger !!"+pointerCount,Toast.LENGTH_SHORT).show();

             Intent z = new Intent(MyclassActivity.this,
                        DashboardActivity.class);
                startActivity(z);
            finish();
           }      

    }

        return super.onTouchEvent(event);
    }

我对这个东西不满意。请你帮我获取并计算出确切的5个手指,并避免多次调用onTouchevent。

谢谢!


3
我认为你不理解什么是触摸事件。这不是在屏幕上点击。如果你移动任何一个手指或改变压力,将会调用onTouchEvent - abc667
@PlumillonForge:我不满意,因为我想在获取指针数大于或等于4时执行我的内容。否则它会被多次调用。 - Mahi
@abc667:我知道兄弟,这就是我的问题,如果我想触摸并只想检测到5个手指,我该如何避免多次调用呢! - Mahi
@ShreeshaS:我已经检查过了!但可能是代码有点混淆。你能帮我解决一下吗? - Mahi
@gaurav Kumawat:已完成兄弟,经过一些更改以下代码正在运行中。感谢您的建议。 - Mahi
显示剩余3条评论
2个回答

2

我认为每当您从屏幕上移除一个手指时,MotionEvent.ACTION_POINTER_UP 就会被调用。因此,如果您用 5 个手指触摸屏幕,它将会被调用多次。尝试在您的实现中使用 MotionEvent.ACTION_UP。统计所有手指数 -> 检查何时调用了 MotionEvent.ACTION_UP -> 如果手指数量最高为 5,则执行您的代码。

int maxPointercount; 
int previousPointercount; 

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

     int currentpointerCount = event.getPointerCount();

     Log.d("1", "My pointer = " + currentpointerCount); //what does it say here?

     final int action = event.getAction();
          switch (action & MotionEvent.ACTION_MASK) {
               case MotionEvent.ACTION_POINTER_DOWN:          
                 if(maxPointercount <= previousPointercount){
                 maxPointercount = currentpointerCount;
                }
                previousPointercount = currentpointerCount;
          }  

    if(action == MotionEvent.ACTION_UP) {
       Log.d("3", maxPointercount + " = maxPointercount");
       if(maxPointercount == 5){ //or whatever amount of fingers, try it out. 

          //your code that will run 1 time

       }
          maxPointercount = 0;
          previousPointercount = 0;      

     }
     return super.onTouchEvent(event);
}

编辑:再次修复!现在真正起作用了。


正如您所说,我已经在这里更新了我的代码!但是它不起作用!请查看上面的代码并让我寻求您的帮助! - Mahi
兄弟,你需要做的不仅仅是替换那一行代码!当最后一个手指离开屏幕时,会发送ACTION_UP信号。在这个时刻,你需要知道在触摸屏幕并释放所有手指的过程中,手指的最高数量是多少。如果是5个手指,就执行你的代码。 - Edward van Raak
我已经放置了4、3、2...但它并不满足那个条件!! - Mahi
你没有把 "int maxPointercount" 和 "int previousPointercount;" 放在 onTouch() 里面,对吧?它们需要成为全局变量。在条件语句之前,print line 说了什么?请编辑您的原始帖子而不是在此处发表评论。 - Edward van Raak
我已经尝试在logcat中打印这两个值。触摸屏幕后,每次这两个变量都会给出“0”的值。 - Mahi
显示剩余5条评论

1
我遇到了很多困难,不知道它是如何工作的,所以这里是我总结出来的基本内容。
public boolean onTouchEvent(MotionEvent event){
    int eventaction = event.getAction();
    String str= "";
    //touch Events, i came up with the mask 5 by trial, hope it works for all devices
    //eventaction == 0 match the first touch event ever
    if( ( eventaction & 5 ) == 5  || eventaction == 0 ){
        str= "Touch Event";
    }
    //Release Event, i came up with the mask 6 by trial, hope it works for all devices 
    //eventaction == 1 match the last release event ever, this makes it hard to know wich finger was removed 
    if( ( eventaction & 6 ) == 6  || eventaction == 1 ){
        str= "Release Event:";
    }
    if( eventaction == 2 ){
        str= "Move Event:";
        return true;//it will make a mess in the logcat, if u want remove this line
    }
    str += " With Number Of fingers " + event.getPointerCount() ;
    str += ", the finger triggered the event is : finger ";
    //some stupid thing i have done, but it works 
    //these numbers was made based on the binary mask that i was able to figure out
    //but it still has an issue with the last finger removed as its eventaction  is always 0, but this can be pragmatically known by monitoring each finger touch and release 
    switch ( eventaction ){
    case 0:
    case 5:
    case 6:
        str += "1";
        break;
    case 261:
    case 262:
        str += "2";
        break;
    case 517:
    case 518:
        str += "3";
        break;
    case 773:
    case 774:
        str += "4";
        break;
    case 1029:
    case 1030:
        str += "5";
        break;
    case 1285:
    case 1286:
        str += "6";
        break;
    case 1541:
    case 1542:
        str += "7";
        break;
    case 1797:
    case 1798:
        str += "8";
        break;
    case 2053:
    case 2054:
        str += "9";
        break;
    case 2309:
    case 2310:
        str += "10";
        break;
    }
    Log.d("Test", str );
    return true;
}

希望这能帮助任何人,如果您仍然缺少信息,我很乐意帮助 ^_^。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接