Android: OnTouch, MotionEvent.ACTION_MOVE не распознается?

Вот мой код, я хочу обнаружить, когда мой палец идет по экрану, поэтому, когда я касаюсь экрана, я обнаруживаю ACTION_DOWN но когда я спускаюсь по экрану пальцем, ACTION_MOVE не распознается, ни ACTION_UP Знаете ли вы, почему?

  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 } } } } 

Solutions Collecting From Web of "Android: OnTouch, MotionEvent.ACTION_MOVE не распознается?"

Если ваш onTouch() возвращает false в ответ на начальный ACTION_DOWN MotionEvent , он не получит ни одно из последующих событий, относящихся к этому конкретному жестом. Вместо этого те сенсорные события будут представлены родительскому элементу в иерархии.

Чтобы onTouch() это другим способом, если вы onTouch() false из onTouch() во время начала жестов ( ACTION_DOWN ), это ACTION_DOWN , что метод больше не хочет видеть больше этого жеста и что события жестов должны перейти к Родительский View .

Как отмечает markproxy в комментариях ниже, возврат false когда MotionEvent является чем-то иным, чем ACTION_DOWN , например ACTION_MOVE , не будет препятствовать последующему представлению MotionEvent s в текущем жесте представлению.

MotionEvent.getAction() возвращает больше, чем просто флаг. Попробуйте следующее:

 int action = arg1.getAction() & MotionEvent.ACTION_MASK; if (action == MotionEvent.ACTION_MOVE) ... 

Вы также можете использовать MotionEvent.getActionMasked() . См. Также http://developer.android.com/reference/android/view/MotionEvent.html

Пара вещей:

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; } }); } } 

Вот основной файл .xml

::

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/touchTest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 

Проверьте возвращаемое значение метода onTouch ().

Это должно быть правдой, а не ложью.

 return true; 

Надеюсь, что это сработает.

Есть два случая:

1) Если вы также установили OnClickListener () -> onTouch (), следует вернуть false.

(Если onTouch () возвращает true, OnClickListener () не будет работать)

2) Если вы не установите OnClickListener () -> onTouch (), необходимо вернуть true.

(Если onTouch () возвращает false, вызывается только ACTION_DOWN)