Android VelocityTracker使用总结

Android 使用VelocityTracker来获取滑动速度 android.view.VelocityTracker主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率。用addMovement(MotionEvent)函数将Motion event加入到VelocityTracker类实例中.你可以使用getXVelocity() 或getXVelocity()获得横向和竖向的速率到速率时,但是使用它们之前请先调用comput... 阅读详情

VelocityTracker是一个什么东西呢,查看VelocityTracker源代码发现有如下注释:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.     * Helper for tracking the velocity of touch events, for implementing  
  3.     * flinging and other such gestures.  
  4.     *  
  5.     * Use {@link #obtain} to retrieve a new instance of the class when you are going  
  6.     * to begin tracking.  Put the motion events you receive into it with  
  7.     * {@link #addMovement(android.view.MotionEvent)}.  When you want to determine the velocity call  
  8.     * {@link #computeCurrentVelocity(int)} and then call {@link #getXVelocity(int)}  
  9.     * and {@link #getYVelocity(int)} to retrieve the velocity for each pointer id.  
  10.     *  
  11.     * 追踪触摸事件速率,实现flinging和其他手势的帮助类  
  12.     *  
  13.     * 1、当开始追踪的时候,使用obtain来获取VelocityTracker类的实例  
  14.     * 2、把接收到的MotionEvent放入到addMovement(android.view.MotionEvent)中  
  15.     * 3、当要确定速度时调用computeCurrentVelocity(int),  
  16.     *   使用getXVelocity(int)和getYVelocity(int)来检测每个触摸点id的速率  
  17.     */  

VelocityTracker是一个帮助追踪触摸事件速率的追踪器,可以追踪fliinging和其他触摸手势。

如何使用VelocityTracker呢,注释中提到如下步骤:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. 1、当开始追踪的时候,使用obtain来获取VelocityTracker类的实例  
  2. 2、把接受到的MotionEvent放入到addMovement(android.view.MotionEvent)中  
  3. 3、当要确定速度时调用computeCurrentVelocity(int),  
  4.       使用getXVelocity(int)和getYVelocity(int)来检测每个触摸点id的速率  

既然VelocityTracker是追踪触摸事件的速度追踪器,当然需要与触摸事件结合使用。

第一步:当你想要追踪触摸事件的速度时,使用private VelocityTracker mVelocityTracker = VelocityTracker.obtain();来获取一个实例,

obtain()方法的源代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.   * Retrieve a new VelocityTracker object to watch the velocity of a 
  3.   * motion.  Be sure to call {@link #recycle} when done.  You should 
  4.   * generally only maintain an active object while tracking a movement, 
  5.   * so that the VelocityTracker can be re-used elsewhere. 
  6.   * 
  7.   * @return Returns a new VelocityTracker. 
  8.   * 
  9.   * 获取一个新的VelocityTracker对象,用于检测一个动作的速率 
  10.   * 检测结束时确保调用了recycle()方法来回收VelocityTracker对象 
  11.   * 追踪一个移动事件时通常只需要维护一个活动对象,这样VelocityTracker可以被重用 
  12.   */  
  13.  static public VelocityTracker obtain() {  
  14.      VelocityTracker instance = sPool.acquire();  
  15.      return (instance != null) ? instance : new VelocityTracker(null);  
  16.  }  

第二步:把接收到的MotionEvent放入到addMovement(MotionEvent event)方法中,

在初始化MotionEvent的ACTION_DOWN时调用addMovement(MotionEvent event)

然后在ACTION_MOVE和ACTION_UP动作中就可以检测到速度了。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * Add a user's movement to the tracker.  You should call this for the 
  3.     * initial {@link MotionEvent#ACTION_DOWN}, the following 
  4.     * {@link MotionEvent#ACTION_MOVE} events that you receive, and the 
  5.     * final {@link MotionEvent#ACTION_UP}.  You can, however, call this 
  6.     * for whichever events you desire. 
  7.     * 
  8.     * @param event The MotionEvent you received and would like to track. 
  9.     * 
  10.     * 添加一个移动事件到追踪器 
  11.     * 1.为初始化MotionEvent的ACTION_DOWN动作调用addMovement() 
  12.     * 2.接下来,在MotionEvent的ACTION_MOVE和ACTION_UP动作中接收。 
  13.     *    不管是哪一个events都可以调用本方法 
  14.     */  
  15.    public void addMovement(MotionEvent event) {  
  16.        if (event == null) {  
  17.            throw new IllegalArgumentException("event must not be null");  
  18.        }  
  19.        nativeAddMovement(mPtr, event);  
  20.    }  

第三步:想要确定速度的时候调用computeCurrentVelocity(int units)方法。有两个同样的方法,一个带有最大值参数,默认为Float.MAX_VALUE

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Compute the current velocity based on the points that have been 
  3.  * collected.  Only call this when you actually want to retrieve velocity 
  4.  * information, as it is relatively expensive.  You can then retrieve 
  5.  * the velocity with {@link #getXVelocity()} and 
  6.  * {@link #getYVelocity()}. 
  7.  * 根据收集到的触摸点计算当前速率 
  8.  * 因为此方法相当消耗性能,所以只有当真的确实想要检测速度信息的时候才调用这个方法 
  9.  * 然后可以通过getXVelocity()和getYVelocity()方法获取到追踪的速度 
  10.  * 
  11.  * @param units The units you would like the velocity in.  A value of 1 
  12.  * provides pixels per millisecond, 1000 provides pixels per second, etc. 
  13.  *        units :代表速度的单位, 
  14.  *              值为1时:代表每毫秒运动一个像素,px/ms 
  15.  *              值为1000时:代表每秒运动1000个像素,1000px/s 
  16.  * @param maxVelocity The maximum velocity that can be computed by this method. 
  17.  * This value must be declared in the same unit as the units parameter. This value 
  18.  * must be positive. 
  19.  *        maxVelocity :代表可以被本方法计算的最大速度, 
  20.  *                    这个值必须用同一个作为速度参数的单位声明,而且值必须为正数 
  21.  */  
  22. public void computeCurrentVelocity(int units, float maxVelocity) {  
  23.     nativeComputeCurrentVelocity(mPtr, units, maxVelocity);  
  24. }  

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * Equivalent to invoking {@link #computeCurrentVelocity(int, float)} with a maximum 
  3.     * velocity of Float.MAX_VALUE. 
  4.     * 
  5.     * @see #computeCurrentVelocity(int, float) 
  6.     *  
  7.     * 等价调用带有最大值为Float.MAX_VALUE的computeCurrentVelocity(int, float)方法, 
  8.     */  
  9.    public void computeCurrentVelocity(int units) {  
  10.        nativeComputeCurrentVelocity(mPtr, units, Float.MAX_VALUE);  
  11.    }  

第四步:使用getXVelocity()和getYVelocity()方法获取检测到的速度

获取X轴方向的速度:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * Retrieve the last computed X velocity.  You must first call 
  3.     * {@link #computeCurrentVelocity(int)} before calling this function. 
  4.     *  
  5.     * 检测最后计算的X轴方向的速度,在调用getXVelocity()之前必须先调用computeCurrentVelocity(int) 
  6.     * @return The previously computed X velocity. 
  7.     */  
  8.    public float getXVelocity() {  
  9.        return nativeGetXVelocity(mPtr, ACTIVE_POINTER_ID);  
  10.    }  
获取Y轴方向上的速度:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.      * Retrieve the last computed Y velocity.  You must first call 
  3.      * {@link #computeCurrentVelocity(int)} before calling this function. 
  4.      * 
  5.      * 检测最后计算的X轴方向的速度,在调用getXVelocity()之前必须先调用computeCurrentVelocity(int) 
  6.      * @return The previously computed Y velocity. 
  7.      */  
  8.     public float getYVelocity() {  
  9.         return nativeGetYVelocity(mPtr, ACTIVE_POINTER_ID);  
  10.     }  

第五步:回收VelocityTracker实例

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.    * Return a VelocityTracker object back to be re-used by others.  You must 
  3.    * not touch the object after calling this function. 
  4.    * 
  5.    * 回收一个VelocityTracker对象给其他动作事件使用 
  6.    * 在调用recycle()这个函数之后,你不能访问VelocityTracker对象 
  7.    */  
  8.   public void recycle() {  
  9.       if (mStrategy == null) {  
  10.           clear();  
  11.           sPool.release(this);  
  12.       }  
  13.   }  


小实例:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.zwc.admin.scrollerdemo;  
  2.   
  3. import android.support.v7.app.ActionBarActivity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.view.VelocityTracker;  
  8.   
  9.   
  10. public class VelocityTrackerTestActivity extends ActionBarActivity {  
  11.   
  12.     private static final String TAG = "VelocityTrackerTestActivity";  
  13.   
  14.     private VelocityTracker mVelocityTracker;  
  15.     private int mPointerId;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_velocity_tracker_test);  
  21.     }  
  22.   
  23.     @Override  
  24.     public boolean onTouchEvent(MotionEvent event) {  
  25.         int action = event.getAction();  
  26.         if (null == mVelocityTracker) {  
  27.             mVelocityTracker = VelocityTracker.obtain();  
  28.         }  
  29.         mVelocityTracker.addMovement(event);  
  30.           
  31.         switch (action) {  
  32.             case MotionEvent.ACTION_DOWN:  
  33.                 //获取第一个触摸点的id  
  34.                 mPointerId = event.getPointerId(0);  
  35.                 break;  
  36.   
  37.             case MotionEvent.ACTION_MOVE:  
  38.                 mVelocityTracker.computeCurrentVelocity(1000);  
  39.                 float xVelocity = mVelocityTracker.getXVelocity(event.getPointerId(mPointerId));  
  40.                 float yVelocity = mVelocityTracker.getYVelocity(event.getPointerId(mPointerId));  
  41.                 Log.e(TAG, "xVelocity = " + xVelocity + ",yVelocity = " + yVelocity);  
  42.                 break;  
  43.   
  44.             case MotionEvent.ACTION_UP:  
  45.             case MotionEvent.ACTION_CANCEL:  
  46.                 if (null != mVelocityTracker) {  
  47.                     mVelocityTracker.recycle();  
  48.                 }  
  49.                 break;  
  50.         }  
  51.   
  52.         return super.onTouchEvent(event);  
  53.     }  
  54.   
  55. }  
Python爬虫实战:5分钟搞定政府网站公开数据抓取(附完整代码) 本文详细介绍了如何使用Python爬虫快速抓取政府网站公开数据,包括环境配置、网站结构分析、请求头构建、数据处理与存储等关键步骤。通过实战案例和完整代码,帮助开发者高效获取结构化数据,适用于数据分析、市场研究等场景。 阅读详情

相关推荐

mcgs数据导出到U盘

mcgs触摸屏在工业中应用还是很多的,尤其他的脚本功能策略功能等将开放性放到了最大,让用户可以根据实际需求进行自由创作,正因为这样,对一些初学者就不是很友好,初学者想要简单操作就能实现功能,但是mcgs不可能两者兼备,在做工业设备,一些数据的采集保存就比较常见,但是mcgs没有相关按钮能够直接实现将数据导出到U盘的功能。这里我给大家讲解关于mcgs将报警历史记录、日志记录、历史数据记录导出到U盘的方法。

qq_24866535的博客 6233

Android 安卓DataBinding(六)·双向绑定(1)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

w5jaLw的博客 1131

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(中)

介绍了三相电机控制中的SVPWM算法实现及保护机制设计。SVPWM部分详细解析了电压矢量扇区判断、占空比计算和过调制保护,通过限制占空比范围(0-100%)防止电机失控,并提供了完整的代码实现。保护模块则重点分析了过流、过压/欠压、过温三种保护机制,采用分级处理策略(硬保护停机/软保护降功率)确保系统安全。此外,文章还介绍了参数管理模块在STM32 Flash中的存储方案,包括参数定义、数据结构和读写操作,为电机控制系统提供了完整的解决方案。

bother3000的博客 1389

让控件如此丝滑Scroller和VelocityTracker的API讲解与实战——Android高级UI

目录 一、前言 二、Scroller 三、VelocityTracker 四、实战——带惯性滑动的柱状图 五、写在最后 一、前言 自定义控件中,难免会遇到需要滑动的场景。而Canvas提供的scrollTo和scrollBy方法只能达到移动的效果,需要达到真正的滑动便需要我们今天分享的两把基础利器Scroller和VelocityTracker。老规矩,先上实战图,再进行分享。 带惯性滑动的柱...

weixin_34010949的博客 658

STM32驱动电磁阀电路设计:从光耦选型到MOSFET驱动的实战解析

本文深入解析了STM32驱动24V电磁阀的完整电路设计,重点探讨了光耦选型与MOSFET驱动两大核心环节。针对电平转换与电气隔离需求,详细对比了EL357N与TLP2310等光耦在CTR、速度及耐压等关键参数上的差异与应用场景。同时,文章提供了MOSFET关键参数解读、驱动电路优化方案(如推挽驱动)以及完整的PCB布局、电源处理与调试避坑指南,旨在帮助工程师构建稳定可靠的工业控制电路。

weixin_29184371的博客 234

当 AI + 可视化融入消防:开启智能消防新时代

总结来说,AI + 可视化技术融入消防,开启了智能消防新时代。它以精准预警、高效救援和全面资源管理,革新消防工作方式。从前期规划到系统搭建,再到后期运维,每个环节都为提升消防能力奠定基础。尽管面临技术成本、数据安全和人员适应等挑战,但随着技术发展和应用推广,这些问题将逐步解决。相信在 AI + 可视化助力下,消防领域将不断进步,为人们创造更安全生活环境,有效抵御火灾威胁。

2401_87844374的博客 1220

Android VelocityTracker简介

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2301_77595001的博客 420

SAP Business One自定义表与字段实战:从零构建企业专属数据模型

本文详细介绍了如何在SAP Business One中创建自定义表与字段,从零构建企业专属数据模型。通过实战案例和避坑指南,帮助用户掌握业务适配、流程优化和权限隔离等关键技巧,提升系统灵活性和数据管理效率。特别适合需要扩展标准功能的SAP Business One用户。

weixin_28730927的博客 362

Android View事件体系

1.View基础知识 getX()/getY()返回的是相对于当前View左上角的x和y坐标,而getRawX()/getRawY()返回的是相对于手机屏幕左上角的x和y坐标. TouchSlop: TouchSlop是系统所能识别出的被认为是滑动的最小距离,这是一个常量,和设备有关.可以通过如下方式获取该常量:ViewConfiguration. get(getContext()).getSc...

潇风寒月 482

DRAM架构演进与HBM技术在高性能计算中的应用

DRAM(动态随机存取存储器)是现代计算系统中关键的内存技术,其架构优化直接影响数据供给能力。随着AI训练和科学计算等数据密集型负载的普及,传统DDR架构面临带宽墙、能效比和访问粒度等挑战。HBM(高带宽内存)通过3D堆叠技术(如TSV硅通孔)和异构集成(如PIM存内计算)显著提升了带宽和能效比。这些技术在高性能计算、AI推理和大模型训练等场景中展现出巨大潜力,例如HBM3的带宽可达819GB/s,能效比低至0.95pJ/b。未来,DRAM技术将继续向更高密度、更低功耗和更智能的内存计算方向发展。

weixin_35757191的博客 400

Cadence仿真笔记(二):传统noise仿真—共源极的噪声

cadence中进行传统噪声仿真

Bao_xue的博客 1万+

Android VelocityTracker 滑动速度追踪

应用开发过程中,会有类似这样的需求,检测手指滑动距离或在某一个方向的滑动速度,当滑动距离或在某一个方向的滑动速度达到临界值时,将 View 消失或进行其他的业务逻辑处理。

ToSimple的博客 1725

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)和实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)和Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2019

安卓VelocityTracker使用小例子

安卓VelocityTracker使用小例子定义:VelocityTracker是位于android.view.VelocityTracker的一个工具类,用于监听滑动的速度,顾名思义Velocity(速度)Tracker(追踪者) 常用api /** * Retrieve a new VelocityTracker object to watch the velocity of a

syk1996的博客 516

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

代码讲解Android Scroller、VelocityTracker

在编写自定义滑动控件时常常会用到Android触摸机制和Scroller及VelocityTracker。Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程对Android触摸机制需要用到的函数进行了详细的解释,本文主要介绍两个重要的类:Scroller及VelocityTracker。利用上述知识,最后给出了一个自

bigconvience的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android VelocityTracker用法

在Android开发过程中,有这样一个普遍的需求:用手指滑动一个View,当手离开屏幕后View还能滑动一定的距离。 要完成这样的效果只需两步:1.获取手指离开时的速度。2.使View滚动一定的距离。

civil的专栏 4869

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android小总结:VelocityTracker

VelocityTracker是一个什么东西呢,查看VelocityTracker源代码发现有如下注释: /** * Helper for tracking the velocity of touch events, for implementing * flinging and other such gestures. * * Use {@link #

zhengweicong2011的专栏 1361

【安卓笔记】VelocityTracker使用示例

VelocityTracker可以获取触屏事件的速率。 使用步骤: 1.获取VelocityTracker实例: VelocityTracker mVelocityTracker = VelocityTracker.obtain();2.将MotionEvent事件纳入到VelocityTracker中:mVelocityTracker.addMovement(event);3.

RowandJJ 2791

Android VelocityTracker的使用

VelocityTracker是android中用于计算触摸速度的类,从其字面意思来看就是速度追踪,使用VelocityTracker的方法如下: 一、首先通过VelocityTracker的静态方法获得VelocityTracker对象 velocityTracker = VelocityTracker.obtain(); 二、为VelocityTracker对象添加MotionEvent

记录技术,记录生活 1270

Android Scroller、VelocityTracker

在编写自定义滑动控件时常常会用到Android触摸机制和Scroller及VelocityTracker。Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程对Android触摸机制需要用到的函数进行了详细的解释,本文主要介绍两个重要的类:Scroller及VelocityTracker。利用上述知识,最后给出了一个自

ncepu307的专栏 1204

Android VelocityTracker

转自: http://blog.chinaunix.net/uid-23392298-id-3330470.html         http://blog.youkuaiyun.com/dylancao/article/details/7534945   用来追踪触摸事件(flinging事件和其他手势事件)的速率。用obtain() 函数来获得类的实例,用addMovement(MotionEv...

SunRaIN_的专栏 347

Android最全Android VelocityTracker简介,2024年最新安卓面试资料

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

2401_84556564的博客 1200
上一篇: android view滑动助手类OverScroller
下一篇: OverScroller、VelocityTracker、ViewConfiguration综合使用达到炫酷效果
coder_nice
博客等级 码龄12年 33粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值