GestureDetector手势监听不到滑动事件(onFling,onScroll)

在做可以左右的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的时间分发了,推荐博客点我
写的非常详细,静下心来慢慢看。

猜你喜欢

转载自blog.csdn.net/caobin_study/article/details/79290945