web-dev-qa-db-ja.com

Android-特定のビューでのジェスチャー検出(上下にスワイプ)

OnGestureListenerをAndroidに実装しようとしています。
レイアウトに3つのTextViewがあります。
私が達成しようとしているのは、2つのtextViewにジェスチャーリスナーを設定することです。
ここにレイアウト-

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/rlMain"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >

<TextView
    Android:id="@+id/tvOne"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="5dp"
    Android:gravity="center"
    Android:text="One" />

<TextView
    Android:id="@+id/tvTwo"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/tvOne"
    Android:layout_centerHorizontal="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="5dp"
    Android:gravity="center"
    Android:text="Two" />

<TextView
    Android:id="@+id/tvThree"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/tvTwo"
    Android:layout_centerHorizontal="true"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="5dp"
    Android:gravity="center"
    Android:text="Three" />

そして、これがactivity-

import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.GestureDetector;
import Android.view.GestureDetector.OnGestureListener;
import Android.view.MotionEvent;

public class TimeActivity extends Activity implements OnGestureListener {

GestureDetector gestureScanner;

@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.wheelview);
    gestureScanner = new GestureDetector(this);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    return gestureScanner.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    // TODO Auto-generated method stub
    Log.i("Test", "On Fling");
    return true;
}

@Override
public void onLongPress(MotionEvent e) {
    // TODO Auto-generated method stub

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onShowPress(MotionEvent e) {
    // TODO Auto-generated method stub

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}

}

現在、3つのテキストビューすべてのFlingが呼び出されています。
レイアウト内の特定のビューのジェスチャーリスナーを設定する方法はありますか。
どんな助けも大歓迎です。

24
Anukool

onCreateメソッドでこれを行います。

findViewById(R.id.tvOne).setOnTouchListener(new View.OnTouchListener() { 
            @Override
           public boolean onTouch(View v, MotionEvent event){
                return gestureScanner.onTouchEvent(event);
           }
  });
27
M-WaJeEh

OnTouchListenersを個々のTextViewsに設定できます。

findViewById(R.id.tvOne).setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent event) {
         // Your code here
    }
}
10
jaibatrik

提案

すべてのジェスチャーを検出したくない場合は、このクラスを試してください: SimpleGestureListener created by myself。

次に、このクラスの使用法のスニペットを示します。

使用法

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private GestureDetector mDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SimpleGestureListener simpleGestureListener = new SimpleGestureListener();
        simpleGestureListener.setListener(new SimpleGestureListener.Listener() {
            @Override
            public void onScrollHorizontal(float dx) {
                Log.i(TAG,"horizontal = " +dx);
            }

            @Override
            public void onScrollVertical(float dy) {
                Log.i(TAG,"vertical = " +dy);
            }
        });
        mDetector = new GestureDetector(this, simpleGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

スワイプジェスチャーの検出に使用できます。

  • 左または右
  • 上か下
2
user6796845