【问题标题】:Interesting android touch issue有趣的安卓触摸问题
【发布时间】:2011-11-11 15:44:28
【问题描述】:

我遇到的问题是我正在为 onTouch 事件使用触摸侦听器,当我只触摸一次时,似乎不止一次调用触摸。 以下是我的代码

final TextView tv = (TextView)findViewById(R.id.TextView01);

        tv.setOnTouchListener(new View.OnTouchListener() {
            int count1 =0;
            int count2=0;
            public boolean onTouch(View arg0, MotionEvent event) {
                Log.d("Code777","Touch is being called finger");
                int i = event.getPointerCount();



                if(i==1 )
                {
                    if(count1==0)
                    {
                        Log.d("Code777","Touched with 1 finger");
                        count1++;
                        count2=0;
                    }

                }

                 if (i==2 )
                {
                     if(count2==0)
                     {
                        Log.d("Code777","Touched with 2 fingers");
                        edit.append(tv.getText());  
                        count2++;
                        count1=0;
                     }
                }
                return true;
            }
        });

我是不是做错了什么?? 单点触控和双点触控都会打印 3-4 次以上的日志

问题更新的问题是两个事件现在都被触发了

  if(event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN)
                {
                    Log.d("Code777","2 finger touch");
                    return true;
                }else if(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                        Log.d("Code777","Touched with 1 finger");


                    return true;
                }

【问题讨论】:

    标签: android touch-event ontouchlistener


    【解决方案1】:

    您的代码将在每个触摸事件期间执行。第一次激活时,很可能是ACITON_DOWN 事件(当用户第一次触摸屏幕时)。第二次,它可能是针对ACTION_UP 事件(当用户从​​屏幕上抬起手指时)。同样,如果您要在屏幕上滑动手指,同样的代码将针对ACTION_MOVE 事件执行多次。您必须检查它的触摸类型。做这样的事情:

    switch(event.getAction()){
       case MotionEvent.ACTION_DOWN:
         // Do something that should only happen when the user first touches the screen
         break;
       case MotionEvent.ACTION_MOVE:
         // Do something that should only happen when the user is touching the screen
         break;
       case MotionEvent.ACTION_UP:
         // Do something that should only happen when the user stops touching the screen
         break;
    }
    

    编辑:

    Android 中的多点触控充其量是奇怪的。并非所有设备都可以处理它。并非所有设备都可以处理超过 x 次触摸等。如果您想处理单个手指的 DOWN 案例,那么您可以使用 ACTION_POINTER_X 项目。如果你有这样的一系列事件:

    1.  User touches screen
    2.  User touches screen with second finger
    3.  User lifts finger 1
    4.  User touches screen with finger 1
    5.  User lifts finger 2
    6.  User touches screen with finger 2
    7.  User lifts both finger 1 and finger 2
    8.  User touches screen with only finger 2
    9.  User touches screen with finger 1
    

    将触发的事件如下所示:

    1.  ACTION_DOWN
    2.  ACTION_POINTER_2_DOWN
    3.  ACTION_POINTER_1_UP
    4.  ACTION_POINTER_1_DOWN
    5.  ACTION_POINTER_2_UP
    6.  ACTION_POINTER_2_DOWN
    7.  ACTION_UP (also, one of the pointers actions will fire depending on which finger was lifted first)
    8.  ACTION_DOWN
    9.  ACTION_POINTER_2_DOWN
    

    等等。

    【讨论】:

    • 感谢您按照您的建议提供的答案,但我现在有另一个问题,如果我使用 TOUCH_DOWN 它没有检测到双击,有没有办法解决这个问题??
    • ACTION_DOWN 只是第一次接触。您可以第二次检查ACTION_POINTER_2_DOWN。之后,如果手指 2 向下,则你的手指 1 向下,然后将手指 1 向下,ACTION_POINTER_1_DOWN 将触发。
    • 我不明白你的问题。
    • 只有双击事件被执行,Action_pointer_1_Down 没有被执行
    • ACTION_POINTER_1_DOWN 事件只有在触摸屏幕的第一个手指被抬起和放下并且第二个手指从未停止触摸屏幕时才会执行。基本上将其视为一项任务。手指触摸屏幕->如果没有指定pointer1,则将触摸指定给pointer1->否则如果没有指定pointer2,则将触摸指定给pointer2。 Android 中的多点触控不是很直观(尽管在 Honeycomb 中据说更容易;我没有太多经验)。
    【解决方案2】:

    onTouchListener 通过MotionEvents 向您发送多个操作。您可以使用MotionEvent.getAction() 获取当前事件的操作。

    您在这里注意到的很可能是您收到一个ACTION_DOWN(手指已放在显示屏上) 事件,然后是一些小的ACTION_MOVE 事件,当您移动手指时(s ) 轻微地。最后你会得到ACTION_UP(手指已经抬起)你可以通过忽略错误动作的事件来过滤掉这些。

    例如,当移动事件发生时从 onTouch() 返回。

    public boolean onTouch(View arg0, MotionEvent event) {
        Log.d("Code777","Touch is being called finger");
    
        if(event.getAction() == MotionEvent.ACTION_MOVE) {
            Log.d("Code777", "Move event detected, ignored!");
            return false;
        }
    
        // Further processing ..
    }
    

    或使用开关来区分所有相关事件。

    请参阅MotionEvent class documentation 了解可能的操作列表。 .

    【讨论】:

    • 效果很好。谢谢,但我还有另一个问题,如果我使用 TOUCH_DOWN 它没有检测到双击,有没有办法解决这个问题??
    • 您的意思是当您将第二根手指放在显示屏上时没有收到 ACTION_DOWN 事件?
    • 是的,没有调用动作事件。我希望您测试的方式是获取 event.getPointerCount();还是有其他方法可以检测多点触控?
    • 基本上该事件应该被触发。但这取决于设备,有些多点触控存在一些问题。您具体使用的是哪种设备?
    • 我使用的是基本的 droid,但我不认为它是特定于设备的,因为在我之前的代码版本中它正在检测多点触控
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2018-07-13
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多