Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Developers:跟蹤移動

Android Developers:跟蹤移動

編輯:關於Android編程

這個課程描述了如何在觸摸事件中跟蹤移動。

無論當前觸摸接觸點的位置,壓力,或者大小的變化,onTouchEvenet()方法被一個ACTION_MOVE事件觸發。正如在Detecting Common Gestures中描述,所有的這些事件都被記錄在onTouchEvent()方法的MotionEvent參數中。

因為基於手指的觸摸不總是最精確的交互形式,檢測觸摸時間經常是基於移動而不是簡單的觸摸。為了幫助應用程序區分在基於移動的手勢(例如swip)和沒有移動的手勢(例如一個單獨的輕敲),Android包含”觸摸溢出“的概念。觸摸溢出在手勢被翻譯為一個基於移動的手勢之前,引用了用戶的觸摸移動的像素距離。更多這個話題的討論,查閱Managing Touch Evenet in a ViewGroup。

這裡有多種不同的方式來在一個手勢中跟蹤移動,基於你的應用程序的需要。例如:

  • 一個點的開始和結束的位置(例如,移動一個屏幕對象,從點A到點B)。

  • 點移動的方向,通過x和y坐標來被決定。

  • 歷史。通過調用MotionEvent方法getHistorySize()方法,你能找到這個手勢的歷史的大小。你然後通過這個運動事件的getHistorical方法,能獲得每個歷史事件的位置,大小,時間,和壓力。當描繪一個用戶的手指的軌跡的時候,歷史是非常有用的,例如觸摸繪制。查看MotionEvent參考詳情。

  • 這個點它在屏幕上移動的速率。

    跟蹤速度

    —————————————————————————————————————————————————————————————————

    你能擁有一個基於移動的手勢,它僅僅基於點移動的距離和/或者方向。但是速率經常是跟蹤一個手勢的特征,或者甚至是決定一個手勢是否發生的決定因素。為了使速率計算簡單,Android在支持庫中提供了VelocityTracker類和VelocityTrackerCompat類。VelocityTracker幫助你跟蹤這個觸摸事件的速率。這對於手勢是非常有用的,在速率是這個手勢的准則的時候,例如一個fling。

    下面是一個簡單示例,它說明了在VelocityTracker API中方法的目的:

    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。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved