欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 17:53:34
...

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