Tracking Movement

这篇文章用来讲解,如何跟踪touch event的轨迹。

onTouchEvent()方法 由 ACTION_MOVE 事件触发(只要当前的接触的 position, pressure,size发生了变化)。 就像上一篇文章 Detecting Common Gestures讲到的一样,这些event会被记录在MotionEvent中,而这个MotionEvent将作为onTouchEvent()的参数。

用户交互中基于手指触碰的反馈往往都不是最精确的,所以 监测 touch event的时候 用 movement(移动)来判定 比 simple contact(简单的接触)用的更多。

为了 帮助app来辨别 (movement-based gestures)移动类型的手势【例如 swipe 滑动,擦除,】和(nonmovement-based gestures )非移动类型的手势【例如 single tap 单击】。Android提出了一个概念,”touch slop“。 Touch slop用来表明一个用户手指移动的界限,这个界限用来判定这个 手势 是移动类型的手势,还是非移动类型的手势。(这个界限的单位 是pixels 像素)。

换句话说 就是:如果 用户的手指触碰屏幕之后,移动的距离超过了界限,那么判定为 移动类型的手势,如果没有超过界限,则判定为 非移动类型的手势。详细可见

Managing Touch Events in a ViewGroup.

这里有几种不同的方式来跟踪 手势的移动轨迹,根据你的app的需求可以自己选择。

*1.起点和终点(从屏幕的A点移动到B点)

*2.点移动的方向(由x,y共同决定)

*3.历史,你可以通过MotionEvent中的getHistorySize()方法来 找到你的历史手势的size。你也可以通过getHistorical< Value >方法获取 其他的信息 例如 postions,sizes,time,pressures 。

在手机渲染你的手指移动轨迹的时候 历史信息是非常有用的,特别是一些 通过手指画画的应用。 详情可以看 MotionEvent

*4.点在屏幕上移动的速率

Track Velocity

你可能以为 移动类型的手势 都是通过 点移动的距离,或者方向来触发的。其实 速率 也是手势的一个重要的特性,也是决定一个手势能否触发的重要因素。

为了使计算更简单,Android提供了 VelocityTracker类,和 VelocityTrackerCompat类(在Support Library. VelocityTracker)来帮助你 跟踪 touch event的速率。那些用到了 Velocity(速率)的手势是非常有用的,比如 fling(抛掷手势)

下面就是一个简单的使用 VelocityTracker的例子。

public class MainActivity extends Activity {
    private static final String DEBUG_TAG = "Velocity";
        ...
    private VelocityTracker mVelocityTracker = null;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int index = event.getActionIndex();
        int action = event.getActionMasked();
        int pointerId = event.getPointerId(index);

        switch(action) {
            case MotionEvent.ACTION_DOWN:
                if(mVelocityTracker == null) {
                    // Retrieve a new VelocityTracker object to watch the velocity of a motion.
                    mVelocityTracker = VelocityTracker.obtain();
                }
                else {
                    // Reset the velocity tracker back to its initial state.
                    mVelocityTracker.clear();
                }
                // Add a user‘s movement to the tracker.
                mVelocityTracker.addMovement(event);
                break;
            case MotionEvent.ACTION_MOVE:
                mVelocityTracker.addMovement(event);
                // When you want to determine the velocity, call
                // computeCurrentVelocity(). Then call getXVelocity()
                // and getYVelocity() to retrieve the velocity for each pointer ID.
                mVelocityTracker.computeCurrentVelocity(1000);
                // Log velocity of pixels per second
                // Best practice to use VelocityTrackerCompat where possible.
                Log.d("", "X velocity: " +
                        VelocityTrackerCompat.getXVelocity(mVelocityTracker,
                        pointerId));
                Log.d("", "Y velocity: " +
                        VelocityTrackerCompat.getYVelocity(mVelocityTracker,
                        pointerId));
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // Return a VelocityTracker object back to be re-used by others.
                mVelocityTracker.recycle();
                break;
        }
        return true;
    }
}

注意 :

最后要注意的一点是:你应该在ACTION_MOVE事件中计算速率,而不是在ACTION_UP之后。在ACTION_UP之后,x,和 y的速率会变为0;

时间: 2024-11-29 00:18:38

Tracking Movement的相关文章

Fast-tracking approach for building routing topologies in fast-moving networks

In one embodiment, a local node in a communication network determines a set of its neighbor nodes, and determines a respective occurrence frequency at which each particular neighbor node is to be probed based on a rate of change in distance between t

手势跟踪论文学习:Realtime and Robust Hand Tracking from Depth

本文介绍的方法主要是用到了深度信息.提出了一种新的手指检测以及手型初始化的方法.具有很好的鲁棒性.在不使用GPU的情况下,速度就可以达到25FPS.准确率还相当的高.可以说是现在手势识别中最好的方法了. 当前的很多方法要不就是很慢,要不就是使用了GPU,再或者就是需要非常复杂的初始化.而本文提出的方法重新定义了手势的模型,结合了现在通用的两种方法的优势,并且加上一个约束方程,得到了很好的效果. 1.模型的重新定义 每一只手,定义了一个自由度(DOF)为26 的手的模型,其中的6个自由度代表全局的

Computer Vision: OpenCV, Feature Tracking, and Beyond--From &lt;&lt;Make Things See&gt;&gt; by Greg

In the 1960s, the legendary Stanford artificial intelligence pioneer, John McCarthy, famously gave a graduate student the job of “solving” computer vision as a summer project. It has occupied an entire community of academic researchers for the past 4

Method Tracking

一.能做什么? 直观的看到某个时间段内哪个方法花了多少时间. 二.工作台介绍 非独占时间: 某函数占用的CPU时间,包含内部调用其它函数的CPU时间. 独占时间: 某函数占用CPU时间,但不含内部调用其它函数所占用的CPU时间. 三.如何操作 点击Start Method Tracking, 一段时间后再点击一次, trace文件被自动打开, 我们如何判断可能有问题的方法? 通过方法的调用次数和独占时间来查看,通常判断方法是: 如果方法调用次数不多,但每次调用却需要花费很长的时间的函数,可能会有

Google Tango Java SDK开发:Motion Tracking 运动追踪

Java API Motion Tracking Tutorial运动追踪教程 This page describes how the Java API handles motion tracking. 该页面描述了如何使用Java API处理运动追踪. Lifecycle 生命周期 The normal motion tracking system lifecycle consists of three states: TangoPoseData.POSE_INITIALIZING, Tang

手势跟踪论文学习:Realtime and Robust Hand Tracking from Depth(三)Cost Function

iker原创.转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/39050619 Realtime and Robust Hand Tracking from Depth中的Cost Function 学习 首先,我们应该知道,输入的数据是什么:3D 点云数据. 3D点云给我的感觉应该是这种 输出的是:拟合好的手模型(48球体模型). 而这里的的3D 点云数据用p表示,每个球体用Sx 表示. Ci 第i个球体的中心:D表示深度图( 区分还

Motion-Based Multiple Object Tracking

kalman filter tracking... %% Motion-Based Multiple Object Tracking % This example shows how to perform automatic detection and motion-based % tracking of moving objects in a video from a stationary camera. % % Copyright 2014 The MathWorks, Inc. %% %

论文笔记之:Speed Up Tracking by Ignoring Features

Speed Up Tracking by Ignoring Features CVPR 2014 Abstract:本文提出一种特征选择的算法,来实现用最"精简"的特征以进行目标跟踪.重点是提出一种上界 (Upper Bound)来表示一块区域包含目标物体的概率,并且忽略掉这个 bound比较小的区域.我们的实验表明,忽略掉 90%的特征,仍然取得了不错的结果(未损失精度). Ignoring Features in Tracking .  基于滑动窗口的跟踪器,计算大量的 bound

Tracking Boost Regulator TYPICAL 5V REGULATION WITH BOOST CONVERTER AND LDO

Cs5171: Tracking Boost Regulator Adding a current mirror circuit to a typical boost circuit allows the user to select the amount of boost voltage and ensure a constant difference between input and output voltage. This is useful for high side drive ap