Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:OnTouch,MotionEvent.ACTION\u移动未被识别?_Android_Ontouchlistener_Actionevent - Fatal编程技术网

Android:OnTouch,MotionEvent.ACTION\u移动未被识别?

Android:OnTouch,MotionEvent.ACTION\u移动未被识别?,android,ontouchlistener,actionevent,Android,Ontouchlistener,Actionevent,这是我的代码,我想检测我的手指何时进入屏幕,因此当我触摸屏幕时,我会检测到动作\u下降,但当我用手指进入屏幕时,动作\u移动无法识别,动作\u上升 你知道为什么吗 float x=0; protected void onCreate(Bundle savedInstanceState) { do things ImageView image2 = (ImageView) findViewById(R.id.imageView3);

这是我的代码,我想检测我的手指何时进入屏幕,因此当我触摸屏幕时,我会检测到
动作\u下降
,但当我用手指进入屏幕时,
动作\u移动
无法识别,动作\u上升 你知道为什么吗

        float x=0;
protected void onCreate(Bundle savedInstanceState) {
        do things

        ImageView image2 = (ImageView) findViewById(R.id.imageView3);
        image2.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            if (arg1.getAction()==MotionEvent.ACTION_DOWN) {

                x=arg1.getX();
            }
            else {
                if (arg1.getAction()==MotionEvent.ACTION_MOVE){
                    if (arg1.getX()>x) {
                    do things
                    }
                }
                else {
                    if (arg1.getAction()==MotionEvent.ACTION_UP){
                        do things
                    }
                }
            }
}

MotionEvent.getAction()
返回的不仅仅是标志。请尝试以下操作:

int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...
您还可以使用
MotionEvent.getActionMasked()
。 另请参见

如果您的
onTouch()
方法返回
false
以响应初始的
动作
动作事件
,则它将不会接收属于此特定手势的任何后续事件。相反,这些触摸事件将显示给层次结构中的父对象

另一种说法是,如果在手势开始时(动作向下)从
onTouch()
返回
false
,则表示该方法不想再看到任何手势,手势事件应转到父视图

正如markproxy在下面的评论中指出的那样,当
运动事件
不是
动作(向下)
时返回
false
,例如
动作(移动)
,将不会阻止当前手势中后续的
运动事件
呈现给
视图

两件事:

1) 您需要返回一个布尔值以显示您正在查看事件

下面是一个非常简单的实现:

package com.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class TestProjActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final String TAG = "TEST_TAG";
        View v = findViewById(R.id.touchTest);
        v.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                    if (event.getAction()==MotionEvent.ACTION_DOWN) {

                        Log.e(TAG,"Down");
                        return true;
                    }

                    if (event.getAction()==MotionEvent.ACTION_MOVE){

                        Log.e(TAG,"Move");
                        return true;

                    }
                    if (event.getAction()==MotionEvent.ACTION_UP){

                        Log.e(TAG,"Up");
                        return true;
                    }


                    return false;
            }
        });
    }
}
下面是main.xml

::


检查onTouch()方法的返回值

这应该是真的,而不是假的

return true;
希望它能起作用。

有两种情况:

1) 如果还设置了OnClickListener()->onTouch(),则应返回false

(如果onTouch()返回true,OnClickListener()将不起作用)

2) 如果未设置OnClickListener()->onTouch()应返回true


(如果onTouch()返回false,则只调用ACTION\u DOWN)

我不理解getAction和getActionMasked之间的区别,即使读取API也是如此?我尝试了int action=arg1.getAction()&MotionEvent.action_MASK,但不起作用getAction()还返回指针索引(您只需要在处理多个触摸事件时使用指针索引),因此您无法安全地使用带有标志的==但必须使用该MASK或调用getActionMasked()。非常感谢刚刚添加了在动作移动和动作关闭后返回true!我认为要使这个答案正确,还需要稍加改进。当
MotionEvent
是一个
ACTION\u DOWN
事件时,如果从
onTouch()
返回
false
,则表示
视图
不再想看到任何手势,手势的事件应转到父
视图组
。例如,从
ACTION\u MOVE
事件返回
false
,不会阻止将来的事件路由到此
视图
@markproxy。非常感谢-我已经更新了答案,希望它更准确。谢谢。当我改变了返回到真的时候救了我的命。非常感谢。很高兴能提供帮助:)一般来说,代码中有很多不必要的其他/if。如果你把其中一些清理干净,它的阅读和功能都会简单得多。
return true;