GestureDetectorジェスチャーはスライドイベント(onFling,onScroll)をリスニングできません.

7607 ワード

左右可能なimageviewをするときは、ImageViewをカスタマイズしてonTouchEventを書き換え、GestureDetectorに渡してジェスチャーを処理し、onDown()メソッドが実行できることを発見しますが、スライドイベントは常に実行されません.
解決策はデフォルトのonDown()メソッドを書き換え、tureに戻ればいいので、イベントを下に伝え続けます.コードは以下の通りです.
package cn.sccl.app.iss.familyalbum.album;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;

/**
 * Created by caobin on 2018/2/8.
 */

public class GestureImageView extends android.support.v7.widget.AppCompatImageView {

    private String tag = "   ";
    private GestureDetector mGestureDetector;

    public GestureImageView(Context context) {
        this(context, null);
    }

    public GestureImageView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public GestureImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mGestureDetector = new GestureDetector(context, gestureListener);
        //mGestureDetector.setIsLongpressEnabled(false);
    }

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

    /**
     *
     */
    GestureDetector.OnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
            Log.e(tag, "onFling-" + "  ");
            //           ,      。
            int mini_width = 120;
            int mini_speed = 0;
            float distance_right = motionEvent1.getX() - motionEvent.getX();
            float distance_left = motionEvent.getX() - motionEvent1.getX();
            float distance_down = motionEvent1.getY() - motionEvent.getY();
            float distance_up = motionEvent.getY() - motionEvent1.getY();
            if (distance_right > mini_width && Math.abs(v) > mini_speed) {
                Log.e(tag, "onFling-" + "    ");
            } else if (distance_left > mini_width && Math.abs(v) > mini_speed) {
                Log.e(tag, "onFling-" + "    ");
            } else if (distance_down > mini_width && Math.abs(v) > mini_speed) {
                Log.e(tag, "onFling-" + "    ");
            } else if (distance_up > mini_width && Math.abs(v) > mini_speed) {
                Log.e(tag, "onFling-" + "    ");
            }
            return true;
        }


        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            System.err.println("  ");
            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public boolean onDown(MotionEvent motionEvent) {
            //               ,       。
            System.err.println("  ");
            return true;
        }

        @Override
        public void onShowPress(MotionEvent motionEvent) {
            //        ,           ,     
            System.err.println("        ,           ,     ");

        }

        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            //            。
            System.err.println("            ");
            return false;
        }

        @Override
        public void onLongPress(MotionEvent motionEvent) {
            //          ,      。
            System.err.println("          ,      ");
        }
    };
}

ここで主に触れた知識点はandroidの時間配布で、ブログポイントは私が書いた非常に詳細で、心を静めてゆっくり見ることをお勧めします.