`

Android VelocityTracker

阅读更多

转自: 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等,下面简单介绍一下用法。

  1. //获取一个VelocityTracker对象, 用完后记得回收  
  2. //回收后代表你不需要使用了,系统将此对象在此分配到其他请求者  
  3. static public VelocityTracker obtain();  //获得VelocityTracker类实例
  4. public void recycle();  //释放
  5. //计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, ..  
  6. //maxVelocity此次计算速度你想要的最大值  
  7. public void computeCurrentVelocity(int units, float maxVelocity);  
  8. //经过一次computeCurrentVelocity后你就可以用一下几个方法获取此次计算的值  
  9. //id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略  
  10. //其他触点干扰,当然干扰肯定是有的  
  11. public float getXVelocity();  
  12. public float getYVelocity();  
  13. public float getXVelocity(int id);  
  14. 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 velocityTracker滑动速度检测器简单使用

    在Android开发中,VelocityTracker是用于检测用户触摸屏幕滑动手势速度的重要工具。它可以帮助我们了解手指在屏幕上移动的速度和方向,这对于实现如滚动、滑动解锁等手势操作的交互非常有用。本教程将深入讲解如何在...

    详细讲解自定义ViewGroup+Scroller+VelocityTracker做出Launcher滑动

    在Android开发中,自定义ViewGroup是实现复杂交互和界面设计的重要手段。本教程将深入讲解如何结合Scroller和VelocityTracker来实现一个类似Launcher(应用启动器)的滑动效果。这种滑动效果常见于手机桌面,允许...

    Android获取在屏幕滑动速度的实例

    本实例将详细讲解如何利用Android的VelocityTracker类来计算滑动速度。 首先,VelocityTracker是Android提供的一个工具类,用于追踪和计算一段时间内手指在屏幕上移动的速度。它能够帮助开发者获取滑动事件的平均...

    Android高级应用源码-android自定义控件-侧滑菜单.zip

    在Android开发中,自定义控件是提升应用用户体验和界面独特性的重要手段。侧滑菜单是一种常见的交互元素,常用于导航栏或者隐藏功能的展示,比如Google的Material Design设计规范中的抽屉式导航(Drawer Navigation...

    自定义Android可滑动控件源码

    本文将深入探讨如何实现一个可滑动显示图片的控件,通过这个过程,我们可以学习到Android的触控事件处理机制、Scroller类的应用以及VelocityTracker的用法。 首先,Android的触控事件处理主要包括三个基本步骤:...

    Android ScrollView反弹效果

    在Android开发中,ScrollView是一个非常常见的布局容器,它允许用户滚动其内容,特别是当内容超出屏幕范围时。本文将深入探讨如何实现一个自定义的ScrollView,以添加上、下拉的反弹效果,从而提高用户的交互体验。 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    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 ...

    Android代码-上下滚动选择器

    开发者可能使用了Scroller或 VelocityTracker类来处理滚动动画,以确保滚动的平滑性和自然性。 2. **数据绑定**:选择器需要显示数据,因此开发者可能设计了一个接口或者继承自Adapter的类,用于将数据集与视图绑定...

    Android 滑动效果 自定义控件

    此外,如果需要更流畅的滑动效果,可以考虑使用Scroller或VelocityTracker类。 总的来说,自定义ViewGroup并实现滑动效果涉及对Android UI框架的深入理解和巧妙利用。通过精确控制测量、布局、触摸事件处理和动画,...

    android手势翻页效果

    总之,"android手势翻页效果"是Android开发中提升用户体验的一种重要技术,通过理解和运用`GestureDetector`, `Scroller`以及`VelocityTracker`,开发者可以创造出更生动、自然的用户界面。这个小例子对于深入理解...

    三个android窗口滑屏效果代码

    在自定义View或者ScrollView中,可以通过重写computeScroll()方法,结合Scroller和VelocityTracker,实现平滑的滑屏效果。这种技术需要对Android视图的绘制机制有深入理解。 在实际开发中,这三个滑屏效果各有应用...

    Android Spinner滑动调整数值实例.rar

    为了实现滑动调整数值的效果,开发者可能利用了Android的Scroller类或VelocityTracker类来处理滑动速度和轨迹。Scroller可以帮助我们实现平滑的动画效果,而VelocityTracker则可以追踪用户的触摸速度,这些都可以...

    Android实现高级图片滚动控件,3D版的图片轮播器Demo_图片滚动展示.zip

    同时,还需要考虑触摸事件的处理,以便用户可以手动滑动浏览图片,这通常涉及到滑动侦测算法,如VelocityTracker或Scroller类的使用。 在项目中,可能包含了以下关键组件和功能: 1. 图片加载库:高效地加载网络或...

    Android自定义折线图,可左右滑动,可点击

    - 实现滑动手势检测:可以使用GestureDetector或者Scroller/VelocityTracker类来捕捉用户的滑动操作。 - 更新数据范围:根据滑动方向,更新可视区域的数据范围,重新绘制折线图。 - 滑动动画:为了提供平滑的用户...

    精通ANDROID 3(中文版)1/2

    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自定义布局中的平滑移动

    总结来说,实现Android自定义布局的平滑移动需要对`ViewGroup`的生命周期有深刻的理解,熟练运用`VelocityTracker`、`Scroller`和`ViewConfiguration`,并精细处理触摸事件和视图布局。通过这种方式,开发者可以创造...

    Android-Andorid一个类似360安全卫士的可拖动波浪气泡控件

    此外,如果需要气泡随着手指滑动而平滑移动,可能还需要运用到Scroller或VelocityTracker类来处理物理模拟和速度追踪。 考虑到波浪形状的复杂性,开发者可能使用了Bezier曲线来绘制。Bezier曲线是一种数学上常用的...

    android TV开发:实现3D仿Gallery效果

    这可能涉及到`MotionEvent`的处理,以及使用`VelocityTracker`来检测用户的滑动速度和方向。 5. **动画实现**: 为了使滚动过程更加平滑,可以使用`ObjectAnimator`或`ValueAnimator`来实现基于时间的动画效果。你还...

    Android自定义viewgroup快速滑动(4)

    上一篇文章自定义...代码: ... import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics;...import android.view.MotionEvent;...import android.view.VelocityTracker;

    Android自定义侧滑框架

    为了更精确地识别滑动动作,我们可以利用VelocityTracker类来追踪手指移动的速度和方向。 视图动画是侧滑菜单的关键,Android提供了多种动画API,如TranslationAnimation、ObjectAnimator和ValueAnimator。在这里,...

Global site tag (gtag.js) - Google Analytics