VelocityTracker
VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出
当前的速度,这样的用法在android系统空间中随处可见,比如Gestures中的Fling, Scrolling等,下面简单介绍一下用法。
- //获取一个VelocityTracker对象, 用完后记得回收
- //回收后代表你不需要使用了,系统将此对象在此分配到其他请求者
- static public VelocityTracker obtain();
- public void recycle();
- //计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, ..
- //maxVelocity此次计算速度你想要的最大值
- public void computeCurrentVelocity(int units, float maxVelocity);
- //经过一次computeCurrentVelocity后你就可以用一下几个方法获取此次计算的值
- //id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略
- //其他触点干扰,当然干扰肯定是有的
- public float getXVelocity();
- public float getYVelocity();
- public float getXVelocity(int id);
- public float getYVelocity(int id);
下面是我写的一个简单Demo:
- package com.bxwu.demo.component.activity;
- import android.app.Activity;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.VelocityTracker;
- import android.view.ViewConfiguration;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.TextView;
- public class VelocityTrackerTest extends Activity {
- private TextView mInfo;
- private VelocityTracker mVelocityTracker;
- private int mMaxVelocity;
- private int mPointerId;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mInfo = new TextView(this);
- mInfo.setLines(4);
- mInfo.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
- mInfo.setTextColor(Color.WHITE);
- setContentView(mInfo);
- mMaxVelocity = ViewConfiguration.get(this).getMaximumFlingVelocity();
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- final int action = event.getAction();
- acquireVelocityTracker(event);
- final VelocityTracker verTracker = mVelocityTracker;
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- //求第一个触点的id, 此时可能有多个触点,但至少一个
- mPointerId = event.getPointerId(0);
- break;
- case MotionEvent.ACTION_MOVE:
- //求伪瞬时速度
- verTracker.computeCurrentVelocity(1000, mMaxVelocity);
- final float velocityX = verTracker.getXVelocity(mPointerId);
- final float velocityY = verTracker.getYVelocity(mPointerId);
- recodeInfo(velocityX, velocityY);
- break;
- case MotionEvent.ACTION_UP:
- releaseVelocityTracker();
- break;
- case MotionEvent.ACTION_CANCEL:
- releaseVelocityTracker();
- break;
- default:
- break;
- }
- return super.onTouchEvent(event);
- }
- /**
- *
- * @param event 向VelocityTracker添加MotionEvent
- *
- * @see android.view.VelocityTracker#obtain()
- * @see android.view.VelocityTracker#addMovement(MotionEvent)
- */
- private void acquireVelocityTracker(final MotionEvent event) {
- if(null == mVelocityTracker) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(event);
- }
- /**
- * 释放VelocityTracker
- *
- * @see android.view.VelocityTracker#clear()
- * @see android.view.VelocityTracker#recycle()
- */
- private void releaseVelocityTracker() {
- if(null != mVelocityTracker) {
- mVelocityTracker.clear();
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- }
- }
- private static final String sFormatStr = "velocityX=%f\nvelocityY=%f";
- /**
- * 记录当前速度
- *
- * @param velocityX x轴速度
- * @param velocityY y轴速度
- */
- private void recodeInfo(final float velocityX, final float velocityY) {
- final String info = String.format(sFormatStr, velocityX, velocityY);
- mInfo.setText(info);
- }
- }
代码很简单,我们可以求出move过程中的伪瞬时速度, 这样在做很多控件的时候都是可以用到的,比如系统Launcher的分页,
ScrollView滑动等, 可根据此时的速度来计算ACTION_UP后的减速运动等。实现一些非常棒的效果。
VelocityTracker的更多相关文章
- android VelocityTracker 速度追踪器的使用及创建
VelocityTracker 速度追踪 第一,创建方式: VelocityTracker mVelocityTracker = new VelocityTracker .obtain() 第二, ...
- 使用VelocityTracker来完成MotionEvent移动速率计算
先看效果图 关键代码(此处记录单点): switch (event.getAction()){ case MotionEvent.ACTION_DOWN: if (veloctiy==null) { ...
- TouchSlop与VelocityTracker认识
TouchSlop是处理触摸事件中的一个常量,被系统认为滑动和点击事件的临界点.理 解这个touchSlop是一个滑动距离值的常量,也就是说当我们手触摸在屏幕上滑动时,如果滑动距离没有超过touchS ...
- VelocityTracker简介
android.view.VelocityTracker主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率.用addMovement(MotionEvent)函数将Mot ...
- 手势识别官方教程(3)识别移动手势(识别速度用VelocityTracker)
moving手势在onTouchEvent()或onTouch()中就可识别,编程时主要是识别积云的速度用VelocityTracker等, Tracking Movement This lesson ...
- 代码讲解Android Scroller、VelocityTracker
在编写自定义滑动控件时常常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简介(二):实例详解onInterceptTouchEvent与 ...
- VelocityTracker简单介绍
翻译自:http://developer.android.com/reference/android/view/VelocityTracker.html 參照自: http://blog.jrj.co ...
- Android UI 学习 自定义的布局 平滑移动 VelocityTracker()
/** * Helper for tracking the velocity of touch events, for implementing * flinging and other such ...
- Android为TV端助力 VelocityTracker 速度追踪器的使用及创建
VelocityTracker 速度追踪 第一,创建方式: VelocityTracker mVelocityTracker = new VelocityTracker .obtain() 第二, ...
随机推荐
- 关于C#中泛型类型参数约束(where T : class)
.NET支持的类型参数约束有以下五种:where T : struct | T必须是一个结构类型where T : class ...
- 简单认识UISwitch
以下是常用属性: self.mySwitch.layer.cornerRadius = 15; // 边框圆角角度 self.mySwitch.layer.borderWidth = 2; // ...
- C# 零散知识 扩展方法 类型约束
今天看到这么一段代码,我看下面调用了NotifyPropertyChanged定义了两个参数,但是调用的时候只写了一个参数.后来查了下,原来这个是扩展方法的用法, 就是说给T扩展了一个方法Notify ...
- [eclipse]改项目名称后tomcat连接问题解决方法
背景:在我们使用eclipse进行项目开发时,有时候会需要修改项目名称,当改动项目名称后发现tomcat启动访问出现问题,使用新的项目名称不可行,使用旧的项目名称却可以.修改web.xml里面的dis ...
- SQLServer中char与varchar的区别
今天写一个项目的用户登录部分 刚开始做,所以是数据库和程序一起写 一开始没注意 在定义表T_Person时吧PerID和PerPwd的类型设定都是char(20) 并且写入了几个数据,诸如 id:01 ...
- eclipse插件本地扩展安装
(1)在Eclipse 安装路径下新建links 路径. (2) 在links 文件夹内,建立X X X .link 文件,该文件的文件名可随意,但后缀必须是link ,通常推荐该文件的文件名与插件名 ...
- 编译流程,C开发常见文件类型名
编译流程 我们常说的编译是一个整体的概念,是指从源程序到可执行程序的整个过程,实际上,C语言编译的过程可以进一步细分为预编译->编译->汇编->链接 预编译是把include关键字所 ...
- 将text 文件转为List
Integer 类型 ArrayList<Integer> Mlist = new ArrayList<Integer>(); Scanner scM = new Scanne ...
- Linux学习之四——磁盘与文件系统管理
一.一些基本定义 1. superblock:记录此 filesystem 的整体信息,包括inode/block的总量.使用量.剩余量, 以及文件系统的格式与相关信息等:2. inode:记录档案的 ...
- C/C++ 位域
//假设硬件平台是intel x86(little endian) typedef unsigned int uint32_t; void inet_ntoa(uint32_t in) { ]; re ...