- 浏览: 281031 次
- 性别:
- 来自: 济南
文章分类
最新评论
转自: http://blog.chinaunix.net/uid-23392298-id-3330470.html
http://blog.csdn.net/dylancao/article/details/7534945
用来追踪触摸事件(flinging事件和其他手势事件)的速率。用obtain() 函数来获得类的实例,用addMovement(MotionEvent)函数将motion event加入到VelocityTracker类实例中,当你使用到速率时,使用computeCurrentVelocity(int)初始化速率的 单位,并获得当前的事件的速率,然后使用getXVelocity() 或getYVelocity()获得横向和竖向的速率。
VelocityTracker.computeCurrentVelocity(int units, float maxVelocity)
计算那些已经发生触摸事件点的当前速率。这个函数只有在你需要得到速率消息的情况下才调用,因为使用它需要消耗很大的性能。通过getXVelocity()和getYVelocity()获得横向和竖向的速率。
参数:
units: 你使用的速率单位.1的意思是,以一毫秒运动了多少个像素的速率, 1000表示 一秒时间内运动了多少个像素。
maxVelocity: 这个方法能计算出事件的最大速率。他的值和上面的units的值具有一样的单位,这个值必须是正数。
private VelocityTracker mVelocityTracker;//生命变量 //在onTouchEvent(MotionEvent ev)中 if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain();//获得VelocityTracker类实例 } mVelocityTracker.addMovement(ev);//将事件加入到VelocityTracker类实例中 //判断当ev事件是MotionEvent.ACTION_UP时:计算速率 final VelocityTracker velocityTracker = mVelocityTracker; // 1000 provides pixels per second velocityTracker.computeCurrentVelocity(1, (float)0.01); //设置maxVelocity值为0.1时,速率大于0.01时,显示的速率都是0.01,速率小于0.01时,显示正常 Log.i("test","velocityTraker"+velocityTracker.getXVelocity()); velocityTracker.computeCurrentVelocity(1000); //设置units的值为1000,意思为一秒时间内运动了多少个像素 Log.i("test","velocityTraker"+velocityTracker.getXVelocity());
详细介绍:
VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出
当前的速度,这样的用法在android系统空间中随处可见,比如Gestures中的Fling, Scrolling等,下面简单介绍一下用法。
- //获取一个VelocityTracker对象, 用完后记得回收
- //回收后代表你不需要使用了,系统将此对象在此分配到其他请求者
- static public VelocityTracker obtain(); //获得VelocityTracker类实例
- 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);
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后的减速运动等。实现一些非常棒的效果。
发表评论
-
android 动态时钟 附源码
2013-09-24 12:03 1285自定义View实践 例子代码 自定义动态时钟 ... -
android Dialog 背景问题
2013-08-14 11:22 1207我们在使用自定义的Dialog的时候,喜欢自己 ... -
ScrollView scrollTo 的使用 动画效果
2013-08-05 17:43 4605今天用到了ScrollView scrollTo方法 ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 1076... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 1057... -
Android中文件选择器的实现
2012-11-30 08:59 1175... -
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
2012-07-31 13:25 1548角点 特征检测与匹配 ... -
【OpenCV】边缘检测:Sobel、拉普拉斯算子
2012-08-04 13:41 1549边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要 ... -
【OpenCV】Canny 边缘检测
2012-08-08 10:17 1997Canny 边缘检测算法 1986 ... -
【UML】案例分析:新型超市购物自助系统
2012-08-19 01:13 129608年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【数据结构】二叉树、AVL树
2012-08-21 00:30 109908年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【计算机图形学】基本图形元素:直线的生成算法
2012-08-23 14:02 106808年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【计算机图形学】基本图形元素:圆的生成算法
2012-08-27 23:06 121908年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【Error】远程连接凭据不工作
2012-09-02 19:51 1038凭据无法工作 近来远程连接实验室的电脑,总是提示“之前用于连 ... -
【Web开发技术】德优教育管理系统
2012-09-07 23:00 94008年9月入学,12年7月毕 ... -
Android onMeasure onLayout
2012-12-20 10:21 1851开始之前不得不说到view的绘制流程,,,请参考:绘制流 ... -
Android getWidth和getMeasuredWidth(转)
2012-12-20 10:00 982一。 也許 很多童 ...
相关推荐
在Android开发中,VelocityTracker是用于检测用户触摸屏幕滑动手势速度的重要工具。它可以帮助我们了解手指在屏幕上移动的速度和方向,这对于实现如滚动、滑动解锁等手势操作的交互非常有用。本教程将深入讲解如何在...
在Android开发中,自定义ViewGroup是实现复杂交互和界面设计的重要手段。本教程将深入讲解如何结合Scroller和VelocityTracker来实现一个类似Launcher(应用启动器)的滑动效果。这种滑动效果常见于手机桌面,允许...
本实例将详细讲解如何利用Android的VelocityTracker类来计算滑动速度。 首先,VelocityTracker是Android提供的一个工具类,用于追踪和计算一段时间内手指在屏幕上移动的速度。它能够帮助开发者获取滑动事件的平均...
在Android开发中,自定义控件是提升应用用户体验和界面独特性的重要手段。侧滑菜单是一种常见的交互元素,常用于导航栏或者隐藏功能的展示,比如Google的Material Design设计规范中的抽屉式导航(Drawer Navigation...
本文将深入探讨如何实现一个可滑动显示图片的控件,通过这个过程,我们可以学习到Android的触控事件处理机制、Scroller类的应用以及VelocityTracker的用法。 首先,Android的触控事件处理主要包括三个基本步骤:...
在Android开发中,ScrollView是一个非常常见的布局容器,它允许用户滚动其内容,特别是当内容超出屏幕范围时。本文将深入探讨如何实现一个自定义的ScrollView,以添加上、下拉的反弹效果,从而提高用户的交互体验。 ...
3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 ...
开发者可能使用了Scroller或 VelocityTracker类来处理滚动动画,以确保滚动的平滑性和自然性。 2. **数据绑定**:选择器需要显示数据,因此开发者可能设计了一个接口或者继承自Adapter的类,用于将数据集与视图绑定...
此外,如果需要更流畅的滑动效果,可以考虑使用Scroller或VelocityTracker类。 总的来说,自定义ViewGroup并实现滑动效果涉及对Android UI框架的深入理解和巧妙利用。通过精确控制测量、布局、触摸事件处理和动画,...
总之,"android手势翻页效果"是Android开发中提升用户体验的一种重要技术,通过理解和运用`GestureDetector`, `Scroller`以及`VelocityTracker`,开发者可以创造出更生动、自然的用户界面。这个小例子对于深入理解...
在自定义View或者ScrollView中,可以通过重写computeScroll()方法,结合Scroller和VelocityTracker,实现平滑的滑屏效果。这种技术需要对Android视图的绘制机制有深入理解。 在实际开发中,这三个滑屏效果各有应用...
为了实现滑动调整数值的效果,开发者可能利用了Android的Scroller类或VelocityTracker类来处理滑动速度和轨迹。Scroller可以帮助我们实现平滑的动画效果,而VelocityTracker则可以追踪用户的触摸速度,这些都可以...
同时,还需要考虑触摸事件的处理,以便用户可以手动滑动浏览图片,这通常涉及到滑动侦测算法,如VelocityTracker或Scroller类的使用。 在项目中,可能包含了以下关键组件和功能: 1. 图片加载库:高效地加载网络或...
- 实现滑动手势检测:可以使用GestureDetector或者Scroller/VelocityTracker类来捕捉用户的滑动操作。 - 更新数据范围:根据滑动方向,更新可视区域的数据范围,重新绘制折线图。 - 滑动动画:为了提供平滑的用户...
25.1.3 使用VelocityTracker 25.1.4 探索拖放操作 25.2 多点触摸 25.2.1 Android2.2之前的多点触摸 25.2.2 自Android 2.2开始的多点触摸 25.3 触摸地图 25.4 手势 25.4.1 捏合手势 25.4.2 ...
总结来说,实现Android自定义布局的平滑移动需要对`ViewGroup`的生命周期有深刻的理解,熟练运用`VelocityTracker`、`Scroller`和`ViewConfiguration`,并精细处理触摸事件和视图布局。通过这种方式,开发者可以创造...
此外,如果需要气泡随着手指滑动而平滑移动,可能还需要运用到Scroller或VelocityTracker类来处理物理模拟和速度追踪。 考虑到波浪形状的复杂性,开发者可能使用了Bezier曲线来绘制。Bezier曲线是一种数学上常用的...
这可能涉及到`MotionEvent`的处理,以及使用`VelocityTracker`来检测用户的滑动速度和方向。 5. **动画实现**: 为了使滚动过程更加平滑,可以使用`ObjectAnimator`或`ValueAnimator`来实现基于时间的动画效果。你还...
上一篇文章自定义...代码: ... import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics;...import android.view.MotionEvent;...import android.view.VelocityTracker;
为了更精确地识别滑动动作,我们可以利用VelocityTracker类来追踪手指移动的速度和方向。 视图动画是侧滑菜单的关键,Android提供了多种动画API,如TranslationAnimation、ObjectAnimator和ValueAnimator。在这里,...