VelocityTracker的简单使用
VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch even。VelocityTracker通过跟踪一连串事件实时计算出当前的速度,这样的用法在android系统空间中随处可见,比如Gestures中的Fling, Scrolling等。
/** * Helper for tracking the velocity of touch events, for implementing * flinging and other such gestures. Use {@link #obtain} to retrieve a * new instance of the class when you are going to begin tracking, put * the motion events you receive into it with {@link #addMovement(MotionEvent)}, * and when you want to determine the velocity call * {@link #computeCurrentVelocity(int)} and then {@link #getXVelocity()} * and {@link #getXVelocity()}. */
简单翻译下:帮助你追踪一个touch事件(flinging事件和其他手势事件)的速率。当你要跟踪一个touch事件的时候,使用obtain()方法得到这个类的实例,然后 用addMovement(MotionEvent)函数将你接受到的motion event加入到VelocityTracker类实例中。当你使用到速率时,使用computeCurrentVelocity(int)初始化速率的单位,并获得当前的事件的速率,然后使用getXVelocity() 或getXVelocity()获得横向和竖向的速率。
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
addMovement(MotionEvent event)
Add a user's movement to the tracker.
|
||||||||||
void |
clear()
Reset the velocity tracker back to its initial state.
|
||||||||||
void |
computeCurrentVelocity(int units, float maxVelocity)
Compute the current velocity based on the points that have been collected.
int unitis表示速率的基本时间单位。unitis值为1的表示是,一毫秒时间单位内运动了多少个像素, unitis值为1000表示一秒(1000毫秒)时间单位内运动了多少个像素
floatVelocity表示速率的最大值
|
||||||||||
void |
computeCurrentVelocity(int units)
Equivalent to invoking
computeCurrentVelocity(int, float) with a maximum velocity of Float.MAX_VALUE.
|
||||||||||
abstract T | getNextPoolable() | ||||||||||
float |
getXVelocity()
Retrieve the last computed X velocity.
|
||||||||||
float |
getXVelocity(int id)
Retrieve the last computed X velocity.
|
||||||||||
float |
getYVelocity(int id)
Retrieve the last computed Y velocity.
|
||||||||||
float |
getYVelocity()
Retrieve the last computed Y velocity.
|
||||||||||
abstract boolean | isPooled() | ||||||||||
static VelocityTracker |
obtain()
Retrieve a new VelocityTracker object to watch the velocity of a motion.
|
||||||||||
void |
recycle()
Return a VelocityTracker object back to be re-used by others.
|
||||||||||
abstract void | setNextPoolable(T element) | ||||||||||
abstract void | setPooled(boolean isPooled) |
从上面的介绍中,我们可以很使用VelocityTracker类去追踪一个移动事件的速率。VelocityTracker的详细使用不走如下:
1.首先获得VelocityTracker的实例
if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}
2.把事件event,将事件加入到VelocityTracker类实例中
mVelocityTracker.addMovement(event);
3. 判断当事件MotionEvent.ACTION_MOVE的时候,调用下面的方法 ,并获取到x,y方向的速度。
final float velocityX = verTracker.getXVelocity(mPoniterId);final float velocityY = verTracker.getYVelocity(mPoniterId);String info = String.format(sFormatStr, velocityX, velocityY);tv_info.setText(info);
4. 判断当事件MotionEvent.ACTION_UP或者MotionEvent.ACTION_CANCEL的时候释放Velocity Tracker
if (null != mVelocityTracker) {mVelocityTracker.clear();mVelocityTracker.recycle();mVelocityTracker = null;}
到此Velocity Tracker的基本使用就介绍完毕了,最后附上Demo的源码,进攻参考。
package cn.chinaiptn.velocitytracker;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewConfiguration;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private VelocityTracker mVelocityTracker;private int mMaxVelocity;private int mPoniterId;private TextView tv_info;private static final String sFormatStr = "velocityX=%f\nvelocityY=%f";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_info = (TextView) findViewById(R.id.tv_info);mMaxVelocity = ViewConfiguration.get(MainActivity.this).getMaximumFlingVelocity();}@Overridepublic boolean onTouchEvent(MotionEvent event) {final int action = event.getAction();initVelocityTracker(event);final VelocityTracker verTracker = mVelocityTracker;switch (action) {case MotionEvent.ACTION_DOWN://求第一个触点的id, 此时可能有多个触点,但至少一个mPoniterId = event.getPointerId(0);break;case MotionEvent.ACTION_MOVE://求伪瞬时速度verTracker.computeCurrentVelocity(1000, mMaxVelocity);final float velocityX = verTracker.getXVelocity(mPoniterId);final float velocityY = verTracker.getYVelocity(mPoniterId);String info = String.format(sFormatStr, velocityX, velocityY);tv_info.setText(info);break;case MotionEvent.ACTION_UP:releaseVelocityTracker();break;case MotionEvent.ACTION_CANCEL:releaseVelocityTracker();break;default:break;}return super.onTouchEvent(event);}/*** 向mVelocityTracker添加MotionEvent** @param event*/private void initVelocityTracker(final MotionEvent event) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(event);}/*** 释放VelocityTracker*/private void releaseVelocityTracker() {if (null != mVelocityTracker) {mVelocityTracker.clear();mVelocityTracker.recycle();mVelocityTracker = null;}}}
本文主要参考了 http://blog.csdn.net/lonelyroamer/article/details/7560598
下篇博文将从源码的角度去熟悉Velocity Tracker的工作原理。
VelocityTracker的简单使用相关推荐
- 滑轮控件研究四、VelocityTracker的简单研究
帮助你追踪一个touch事件(flinging事件和其他手势事件)的速率.当你要跟踪一个touch事件的时候,使用obtain()方法得到这个类的实例,然后 用addMovement(MotionEv ...
- 使用 PulseSensor 脉搏传感器测量心率之一:平台搭建
转自:玩的就是心跳 -- 使用 PulseSensor 脉搏传感器测量心率 作者:邵国际 网址:https://zhuanlan.zhihu.com/p/27665378 写文章 https://pi ...
- VelocityTracker简单介绍
翻译自:http://developer.android.com/reference/android/view/VelocityTracker.html 參照自: http://blog.jrj.co ...
- 代码解说Android Scroller、VelocityTracker
在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简单介绍(二):实例具体解释onInterceptTouchE ...
- android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...
Android ListView实现仿iPhone实现左滑删除按钮的简单实例 需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Ov ...
- Activity简单几步支持向右滑动返回
向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如 ...
- 速度追踪--VelocityTracker
概述 我们都知道安卓手机的事件分为两类,一类是按键事件,另一类就是屏幕滑动事件,而我们大部分的事件都是通过屏幕滑动来产生的.在滑动的过程中你有没有想过要求一下手指在屏幕上滑动的速度呢!我们可以在滑动事 ...
- 防人人网客户端侧滑效果,简单实现Android滑动菜单特效
人人网客户端,有一个侧滑效果不错,就是菜单(menu)和内容(content)可以实现侧滑. 首先,我们先来看一下最终的效果图,有图有真相,这样讲解起来,会更加的清楚. 程序运行时,我们刚开始看到的是 ...
- scrollTo与scrollBy用法以及TouchSlop与VelocityTracker解析
下一篇: scroller类的用法完全解析以及带源码分析 最近在工作中使用到了scrollTo与scrollBy,因此在这准备对它们的用法以及TouchSlop与VelocityTracker做一下整 ...
最新文章
- 北大30岁女博导获2019 IEEE青年成就奖,全球仅三人,深耕微纳电子、神经形态计算...
- Example of BeanFactoryAware in Spring--转
- 论文浅尝 | 改善多语言KGQA的 Zero-shot 跨语言转换
- live2dviewer android,live2dviewerex安卓版
- 大工13秋《计算机文化基础》在线测试1,大工13秋《计算机文化基础》辅导资料六...
- DPDK 中文编程指南
- 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
- 欢迎关注中文开源字体集 Open Source Fonts Collection for Chinese
- McAfee软件下载与安装
- 英语3500词(20/20)dream主题(2022.4.30)
- 推荐一款全能测试开发神器!1分钟快速上手!
- 基于Java的飞机大战游戏的设计与实现(含源文件)
- 游戏王-黑暗大魔法师发动教程
- 2022-08-22 第六小组 瞒春 学习笔记
- 凸优化笔记6(共轭梯度法)
- 比较 Java 枚举成员:== 或 equals()?
- 一期项目实战:问卷调查—人事管理系统
- 极客大挑战php,2019极客大挑战PHP反序列化
- 技术男的春天:小姐姐求助暖男分析
- 带滑动侧边栏的联系人界面