2013-02-08 18 views
24

私のコードは私の指が画面の下に来たときに検出したいので画面に触れるとACTION_DOWNが検出されますが、指で画面を下に移動するとACTION_MOVEは認識されませんACTION_UP あなたは知っていますかどうして?Android:OnTouch、MotionEvent.ACTION_MOVEが認識されませんか?

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

ただ、一般的な点として、あなたはあなたのコード内の不要な他の人の/ IFSの多くを持っている(onTouch()がfalseを返した場合、唯一のACTION_DOWNが呼び出されます)。あなたがそれらのいくつかをきれいにするならば、読みやすく、同じように機能します。 – Nathaniel

答えて

81

が、それはこの特定のジェスチャーに属し、後続のイベントのいずれかを受け取ることができませんを参照してください。そのようなタッチイベントは、階層内の親に提示されます。あなたはジェスチャー(ACTION_DOWN)の開始時にonTouch()からfalseを返す場合、別の方法は、それは方法はもはやジェスチャーのいずれかのより多くのを見たいと思っていることを知らせるなく、ジェスチャーのイベントが行く必要があることをフレーズに

親にView

markproxyはMotionEventは、例えばACTION_MOVEとして、ACTION_DOWN以外である場合falseを返す、以下のコメントで指摘したように、Viewに提示されている現在のジェスチャーに後続MotionEvent Sを防ぐことはできません。

+0

ちょっと感謝しました。 – morg

+3

私は、この答えを正しいものにするためにはわずかな改善が必要だと考えています。 'MotionEvent'が' ACTION_DOWN'イベント_であるときに 'onTouch()'から 'false'を返すと、' View'はもはやそれ以上のジェスチャーを見たくなく、ジェスチャーのイベントは親 'ViewGroup'。例えば、 'ACTION_MOVE'イベントから' false'を返すことは、将来のイベントがこの 'View'にルーティングされることを妨げません。 – markproxy

+0

@markproxy多くのありがとうございます - 私は答えを更新し、うまくいってより正確にしました。 – Trevor

8

MotionEvent.getAction()は単なるフラグ以上のものを返します。以下を試してください。

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

MotionEvent.getActionMasked()も使用できます。 は、あなたのonTouch()方法は、初期ACTION_DOWNMotionEventに応じてfalseを返す場合もhttp://developer.android.com/reference/android/view/MotionEvent.html

+0

私はAPIを読んでもgetActionとgetActionMaskedの違いを理解していませんか? 私はint action = arg1.getAction()&MotionEvent.ACTION_MASKを試しましたが、動作しませんでした – morg

+4

getAction()はポインタインデックスを返します(複数のタッチイベントを処理する場合にのみ必要です)ので、==を安全に使用することはできません。フラグを使用しますが、マスクを使用するかgetActionMasked()を呼び出す必要があります。 – Thalur

4

物事のカップル:

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

ここonTouch()メソッドのmain.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> 
2

チェックの戻り値です。

偽ではありません。

return true; 

希望します。 - > onTouch()はfalseを返す必要があります

1)あなたも(OnClickListener設定した場合):

2

は2例あります。 onTouch()はtrueを返す必要があります> -

2)あなたはOnClickListener()を設定しない場合(onTouch()がtrueを返す場合は、OnClickListener()が動作しません)。

関連する問題