前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解Android View的事件体系 之View基础(二)

详解Android View的事件体系 之View基础(二)

作者头像
黄林晴
发布2019-01-10 15:30:00
5440
发布2019-01-10 15:30:00
举报
文章被收录于专栏:代码男人代码男人

前言

掌握View的事件体系是Android 向高级迈向的必经之路,本片博客讲解Android View的相关基础知识第二部分,后面我们会为大家讲解View事件体系、View事件分发等知识内容。View相关知识第一部分https://cloud.tencent.com/developer/article/1382318

1.View基础

1.1 手势检测GestureDetector

首先我们看一下官方API对GestureDetector的介绍:

GestureDetector 可以检测到用户的点击、双击、长按等事件,该类为我们提供了三个接口和一个内部类。

名称

作用

GestureDetector.OnContextClickListener

上下文单击

GestureDetector.OnDoubleTapListener

双击

GestureDetector.OnGestureListener

检测到手势

GestureDetector.SimpleOnGestureListener

事件子集

1.1.1 GestureDetector.OnGestureListener

         首先我们和上篇博客中提到的一样,新建一个继承自View的类,同时让这个类实现GestureDetector.OnGestureListener接口,我们可以看到该接口复写了下述方法

代码语言:javascript
复制
@Override
public boolean onDown(MotionEvent e) {
    return false;
}

@Override
public void onShowPress(MotionEvent e) {

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    return false;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return false;
}

@Override
public void onLongPress(MotionEvent e) {
    Log.d(TAG,"长按了");
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    return false;
}

通过   gestureDetector = new GestureDetector(this); 初始化gestureDetector,在View的OnTouchEvent事件中,交给gestureDetector来处理即,gestureDetector.onTouchEvent(event);这里我们只看onLongPress方法,顾名思义就是长按时触发的事件,我们在方法中打印Log,当我们的手指在View上长按之后打印日志如下:

1.1.2 GestureDetector.OnDoubleTapListener

接着我们让View实现GestureDetector.OnDoubleTapListener接口,我们可以看到该接口实现了下列方法:

代码语言:javascript
复制
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    return false;
}

@Override
public boolean onDoubleTap(MotionEvent e) {
    Log.d(Tag,"双击Tap");
    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {  
    Log.d(Tag,"双击TapEvent");
    return false;
}

既然是双击实现,那么我们在这里只关心onDoubleTapEvent和onDoubleTap方法,我们在上述两个方法中打印日志,我们在View上双击,打印日志如下:

由此可知onDoubleTapEvent 是双击方法结束时调用,onDoubleTap是双击发生时第一次和第二次间隔时间所触发的,如果只是单击onDoubleTap不会触发。

其实除了双击事件或者说包括双击事件,都是可以直接通过onTouchEvent()方法判断出来的,开发时开发者可根据自己需求自己选择。

1.2 VelocityTracker

       翻译过来就是追踪速度,可以判断滑动的速度以及单击的速度,首先我们获取VelocityTracker对象velocityTracker = VelocityTracker.obtain();在View的onTouchEvent方法中添加:velocityTracker.addMovement(event);

首先要计算速度,计算速度传入计算的时间差值,那么求得的速度就是每像素/时间差,比如我们计算在1S内的速度,代码如下:

代码语言:javascript
复制
velocityTracker.computeCurrentVelocity(1000);
int x = (int) velocityTracker.getXVelocity();
int y = (int) velocityTracker.getYVelocity();

x和y分别为一秒内在x轴滑过的像素和一秒内在y轴滑过的像素。

有view坐标系可以知道,如果在x轴从右向左滑动,那么计算出来的速度为负值。不适用的时候使用clear方法和recycle方法进行内存回收。

github:https://github.com/huanglinqing123

欢迎关注技术公众号,微信号搜索ColorfulCode 代码男人

分享技术文章,投稿分享,不限技术种类,不限技术深度,让更多人因为分享而受益。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 1.View基础
      • 1.1 手势检测GestureDetector
      • 1.2 VelocityTracker
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档