第13章 CustomView控件高级属性

本文深入探讨了Android中GestureDetector的手势识别原理与应用,包括onDown、onScroll、onFling等事件触发机制,以及如何通过SimpleOnGestureListener简化事件处理。同时,介绍了Window与WindowManager的工作机制,演示了如何利用它们实现悬浮窗效果。

一、GestureDetector手势检测

概述:

当用户触摸屏幕的时候,会产生许多手势,如 down、up 、scroll 、fling等。

GestureDetector(手势检测)类,通过这个类可以识别很多手势。在识别出于势之后,具体的事务处理则交 由程序员自己来实现。

 

GestureDetector.OnGestureListener接口:

1.基本讲解

如果我们写一个类并继承自OnGestureListener,则会提示有几个必须重写的函数。

private class gesturelistener implements GestureDetector.OnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        // TODO Auto-generated method stub
        return false;
    }
}

这里重写 了 6 个函数,这些函数在什么情况下才会被触发呢?
• onDown(MotionEvent e):用户按下屏幕就会触发该函数。
• onShowPress(MotionEvent e):如果按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,该函数就会被触发。
• onLongPress(MotionEvent e):长接触摸屏,超过一定时长,就会触发这个函数。

触发顺序:onDown→onShowPress→onLongPress

• onSingleTapUp(MotionEvent e): 从名字中也可 以看出,一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会触发这个函数。当然,如果除down以外还有其他操作,就不再算是单独操作了,也就不会触发这个函数了。
单击一下非常快的(不滑动)Touchup,触发顺序:onDown→onSingleTapUp→onSingleTapConfirmed

单击一下稍微慢一点的(不滑动) Touchup,触发顺序 :onDown→onShowPress→onSingleTapUp→onSingleTapConfirmed

• onFling(MotionEvent el, MotionEvent e2, float velocityX, float velocityY):滑屏,用户按下触摸屏、快速移动后松开,由一个MotionEvent ACTION_DOWN、多个ACTION_MOVE、一个ACTION_UP触发。
• onScroll(MotionEvent el, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件。无论是用手拖动View,还是以抛的动作滚动,都会多次触发这个函数,在ACTION_MOVE动作发生时就会触发该函数。

滑屏,即手指触动屏幕后,稍微滑动后立即松开,触发顺序:onDown→onScroll→onScroll→onScroll→...→onFling

拖动,触发顺序:onDown→onScroll→onScroll→onFling

可见,无论是滑屏还是拖动,影响的只是中间onScroll被触发的数量而己,最终都会触发onFling事件。

2.示例

要使用 GestureDetector,有四步要走 。
(1) 创建 OnGestureListener()监听函数。

GestureDetector.OnGestureListener listener = new GestureDetector.OnGestureListener() {
};
或构造类:
private class gestureListener implements GestureDetector.OnGestureListener {
}

(2) 创建GestureDetector实例mGestureDetector。

GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener};
GestureDetector gestureDetector=new GestureDetector(Context context, GestureDetector.OnGestureListener listener};
GestureDetector gestureDetector=new GestureDetec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值