web-dev-qa-db-ja.com

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

onTouch()メソッドが、最初のACTION_DOWNfalseに応答してMotionEventを返す場合、この特定のジェスチャーに属する後続のイベントを受信しません。代わりに、これらのタッチイベントは、階層内の親に提示されます。

別の言い方をすれば、ジェスチャ(ACTION_DOWN)の開始中にonTouch()からfalseを返すと、メソッドはもう何も表示したくないことを示します。ジェスチャ、およびジェスチャのイベントが親Viewに送信される必要があること。

以下のコメントでmarkproxyが指摘しているように、falseACTION_DOWN以外、たとえばACTION_MOVEなどの場合、MotionEventを返すとnot現在のジェスチャーの後続のMotionEventsがViewに提示されるのを防ぎます。

92
Trevor

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

8
Thalur

いくつかのこと:

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です

::

<?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>
5
Nathaniel

次の2つの場合があります。

1)OnClickListener()-> onTouch()も設定した場合はfalseを返す必要があります。

(onTouch()がtrueを返す場合、OnClickListener()は機能しません)

2)OnClickListener()を設定しない場合-> onTouch()はtrueを返す必要があります。

(onTouch()がfalseを返す場合、ACTION_DOWNのみが呼び出されます)

2
thanhbinh84

OnTouch()メソッドの戻り値を確認してください。

それは偽ではなく真でなければなりません。

return true;

うまくいくことを願っています。

1
Dalvinder Singh