1

ImageViewsクリック可能なアプリがいくつかあります。これらの画像はすべてLinearLayout.

を実装し、OnTouchListenerに設定しましたLinearLayout。スワイプするとOnTouchListener、関数が呼び出されます。

問題は、作品ImageViewsを持たない をスワイプし始めた場合ですが、 を含む画像をスワイプし始めると、機能が機能しません (正常であるため、 も機能しません)。OnClickListenerOnTouchListenerOnClickListenerOnTouchOnClickImageView

ImageViewsユーザーがクリックの代わりにスワイプした場合は下のビューにアクションをonClick渡し、ユーザーがクリックしただけの場合は渡さない方法があるかどうかを知りたいです。

前もって感謝します

4

1 に答える 1

3

私が見つけた唯一の方法は、SimpleOnGestureListenerを使用することでした。誰かが同じ問題を抱えている場合は、コードをコピーして貼り付けます。

次のようなクラスを作成します。

public abstract class MyGestureDetector extends SimpleOnGestureListener {

private static final int SWIPE_MIN_DISTANCE = 100;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
private Activity activity;

public MyGestureDetector(Activity activity) {
    this.activity = activity;
    gestureDetector = new GestureDetector(this);
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }
    };
}

public abstract void onRightToLeftSwipe();

public abstract void onLeftToRightSwipe();

public abstract void onTopToBottomSwipe();

public abstract void onBottomToTopSwipe();

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velX,
        float velY) {
    DisplayMetrics dm = activity.getResources().getDisplayMetrics();
    int REL_SWIPE_MIN_DISTANCE = (int) (SWIPE_MIN_DISTANCE * dm.densityDpi / 160.0f);
    int REL_SWIPE_THRESHOLD_VELOCITY = (int) (SWIPE_THRESHOLD_VELOCITY
            * dm.densityDpi / 160.0f);
    float deltaX = e1.getX() - e2.getX();
    float deltaY = e1.getY() - e2.getY();
    try {
        // swipe horizontal?
        if ((Math.abs(deltaX) > REL_SWIPE_MIN_DISTANCE)
                && (Math.abs(velX) > REL_SWIPE_THRESHOLD_VELOCITY)
                && (Math.abs(deltaX) > Math.abs(deltaY))) {
            // left or right
            if (deltaX < 0) {
                this.onLeftToRightSwipe();
                return true;
            }
            if (deltaX > 0) {
                this.onRightToLeftSwipe();
                return true;
            }
        } else if ((Math.abs(deltaY) > REL_SWIPE_MIN_DISTANCE)
                && (Math.abs(velY) > REL_SWIPE_THRESHOLD_VELOCITY)) { // swipe
            // vertical
            // top or down
            if (deltaY < 0) {
                this.onTopToBottomSwipe();
                return true;
            }
            if (deltaY > 0) {
                this.onBottomToTopSwipe();
                return true;
            }
        } else {
            return false; // We don't consume the event
        }

    } catch (Exception e) {
        // nothing
    }
    return false;
}

public View.OnTouchListener getGestureListener() {
    return gestureListener;
}

public void setGestureListener(View.OnTouchListener gestureListener) {
    this.gestureListener = gestureListener;
}
}

次に、アクティビティでこれを行う必要があります。

public void onCreate(Bundle savedInstanceState) {
     // Initializate your variables here
     // Using Gestures
     MyGestureDetector gestos = new MyGestureDetector(this) {

        @Override
        public void onTopToBottomSwipe() {
            // Do whatever

        }

        @Override
        public void onRightToLeftSwipe() {
            // Do whatever
        }

        @Override
        public void onLeftToRightSwipe() {
            // Do whatever
        }

        @Override
        public void onBottomToTopSwipe() {
            // Do whatever

        }
    };

最後になりましたが、スワイプしたいレイアウトに TouchListener を配置し、クリック可能なレイアウト内のすべてのビューを配置する必要があります。

layoutSwipe = (LinearLayout) findViewById(R.id.layoutSwipe);
layoutSwipe.setOnTouchListener(gestos.getGestureListener());
viewInsidells.setOnTouchListener(gestos.getGestureListener());
view2Insidells.setOnTouchListener(gestos.getGestureListener());

これにより、レイアウト内のビューをクリック可能にすることができます。クリックすると、クリックしたビューのクリック アクションのみが実行され、スワイプすると、動きに応じてスワイプ アクションのみが実行されます。

これを解決するのに 4 時間を費やしました。次の問題に時間を節約できることを願っています。

于 2012-10-15T21:20:31.977 に答える