天天看点

android 滑动监听

今天开发碰到需要用到滑动监听的地方

我直接用 GestureDetector.OnGestureListener开搞 然后一波操作猛如虎 最后 …

在这里先介绍下GestureDetector;

GestureDetector:

GestureDetector中Detector的意思就是探测者,所以GestureDetector就是用来监听手势的发生。它内部有3个Listener接口,用来回调不同类型的触摸事件,用一个简略的类图来显示:

android 滑动监听

里面这些接口的方法,就是相应触摸事件的回调,实现了这些方法,就能实现传入触摸事件之后做出相应的回调。这里我就不详细介绍了 下次有机会再说

继续上面的话题 使用 GestureDetector.OnGestureListener 写完后发现没用触发 查了一波代码 也没发现哪里有错误 后来我查了波资料 换了一种写法

用GestureDetector.SimpleOnGestureListener给弄出来了 直接上代码吧:

首先 你当前的activity实现OnTouchListener

//这是一个监听
Activity implements View.OnTouchListener
           

考虑到用户可能不小心滑到屏幕的情况 定义个值 滑动的最小距离

private static final int FLING_MIN_DISTANCE = 50;   //最小距离
           

接着 定义个GestureDetector.SimpleOnGestureListener实现滑动监听

GestureDetector.SimpleOnGestureListener myGestureListener = new GestureDetector.SimpleOnGestureListener() {
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

            float x = e1.getX() - e2.getX();
            float x2 = e2.getX() - e1.getX();
            float y = e1.getY() - e2.getY();
            float y2 = e2.getY() - e1.getY();
//            判断滑动距离是否大于所设置的最小滑动距离
            if (x > FLING_MIN_DISTANCE) {
                Toast.makeText(WebActivity.this, "向左手势", Toast.LENGTH_SHORT).show();
            } else if (x2 > FLING_MIN_DISTANCE) {
                Toast.makeText(WebActivity.this, "向右手势", Toast.LENGTH_SHORT).show();
            } else if (y > FLING_MIN_DISTANCE) {
                Toast.makeText(WebActivity.this, "向上手势", Toast.LENGTH_SHORT).show();
            } else if (y2 > FLING_MIN_DISTANCE) {
                Toast.makeText(WebActivity.this, "向下手势", Toast.LENGTH_SHORT).show();
            }

            return false;
        }
    };
           

GestureDetector.SimpleOnGestureListener 里面有很多的方法 我们这里只需要onFling()方法 所以其他的我就不写出来了 onFling()中有四个参数

e1:是滑动的起点(手指摁下去的点)

e2:是滑动的终点(手指离开屏幕的点)

velocityX:是X轴滑动的速度(左右滑动的速度)

velocityY:是Y轴滑动的速度(上下滑动的速度)

接下来就是把这个监听设置到你的view中了

在onCreate中进行设置

GestureDetector mGestureDetector;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGestureDetector = new GestureDetector(this, myGestureListener);
        mRelativeLayout mRelativeLayout = findViewById(R.id.layout);//你需要监听的view
        mRelativeLayout.setOnTouchListener(this);//将主容器的监听交给本activity,本activity再交给mGestureDetector
        mRelativeLayout.setLongClickable(true);   //必需设置这为true 否则也监听不到手势

    }
           

最后在上面实现的OnTouchListener的方法中把监听交个mGestureDetector

//设置监听交个mGestureDetector
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return mGestureDetector.onTouchEvent(motionEvent);
    }
           

到这里就结束了 代码不多 在使用GestureDetector.OnGestureListener 无法触发监听的情况下 可以试试这个