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() 第二, ...
随机推荐
- 原创:SAP LVC ALV编辑小技巧
前两天有个打印需求变更,需要在ALV显示列表中添加两个字段,可编辑,而我自己用的是函数:REUSE_ALV_GRID_DISPLAY_LVC 因为之前做可编辑基本都是固定套路,定义类,画屏幕.... ...
- IOS数组NSArray与NSMutableArray知识点
此文是对数组NSArray与NSMutableArray知识点的总结,主要是一些常见的操作,别外一些操作见其相应的文档,下面的代码部分还运用的第三方插件BlocksKit相结合: a:Foundati ...
- DDMS无法查看data/data目录?
今天andorid 学习用真机来尝试用Android SQLite数据库时,从DDMS的FileExplore查看数据库文件时会发现里面是空的什么也没有,之前用的一直都是模拟器,现如今用真机 捣鼓了小 ...
- Asp.net MVC 4新项目中创建area的后续操作
Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况. 无废话具 ...
- informatica 常见问题及解决方案
本文对于informatica使用过程中产生的问题及解决方案做总结,持续更新中... 1.partitioning option license required to run sessions wi ...
- 《第一行代码——Android》
<第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...
- Effective Java 05 Avoid creating unnecessary objects
String s = new String("stringette"); // Don't do this. This will create an object each tim ...
- HttpClient使用方法(包括POST文件)
最近在做跨系统的数据交互业务,从.Net的系统提交数据到Java的系统. 简单的表单Get.POST都没问题,但是有个功能是要提交普通文本和文件,试了好多都有问题,最后用HttpClient小折腾了一 ...
- BaseDao
public class BaseDao { private static Log logger = LogFactory.getLog(BaseDao.class); // 查询数据 public ...
- Varchar2 size how to decide?
When you execute a complicate store procedure, maybe it will execute a long time, maybe you want to ...