最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android手勢識別功能

 更新時間:2017年01月22日 09:40:03   作者:自在時刻  
這篇文章主要為大家詳細介紹了Android手勢識別功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

現(xiàn)在智能手機基本都是觸摸操作,點擊按鈕是一種交互方式,同時手勢相關(guān)的操作,比如滑動等等同樣是很重要的交互方式。這篇文章是對安卓手勢交互相關(guān)知識點的整理和總結(jié),主要來源基于官方文檔。

觸摸交互中的概念

常用事件

首先要了解一些常用的事件:
ACTION_DOWN:第一個手指按下
ACTION_UP:第一個手指抬起
ACTION_POINTER_DOWN:第二、三、四等等手指按下
ACTION_POINTER_UP: 第二、三、四等等手指抬起
ACTION_MOVE: 手指移動
ACTION_OUTSIDE:手指移出了屏幕
ACTION_CANCEL:收到前驅(qū)事件比如ACTION_DOWN后,后續(xù)事件被父控件攔截的情況下產(chǎn)生

上面我們可以看到,除了第一個手指有唯一的action down和action up事件觸發(fā),后續(xù)其它手指的按下和移動,都觸發(fā)的是同一個事件。那么這個時候就可能涉及到對不同手指區(qū)分的邏輯處理。

MotionEvent

MotionEvent中用action code和坐標值描述了觸摸運動的軌跡,action code值描述了運動狀態(tài)的改變,坐標值描述了軌跡的位置和一起其它信息。
比如 ACTION_DOWN表明手指開始觸碰到屏幕,X和Y的坐標軸值表明了當前的位置。

上面僅僅是基本的單指操作,但是現(xiàn)在很多設(shè)備都提供多指操作的功能。多個手指每個手指都被在第一次觸碰屏幕的時候分配一個pointer id,直到這個手指離開相應(yīng)的pointer id才變無效。當?shù)谝粋€手指按下時,會觸發(fā)ACTION_DOWN,ACTION_MOVE一系列的事件,同時當?shù)诙€手指按下的時候,又會觸發(fā) ACTION_POINTER_DOWN事件,此后兩個手指移動的時候,只會觸發(fā)ACTION_MOVE事件。當一個ACTION_MOVE觸發(fā)的時,通過使用 getPointerId(第幾個手指) 方法去獲取pointer id明確是哪一個手指,然后使用使用findPointerIndex 方法去獲得pointer index,pointer index代表了這一個MotionEvent事件中哪一個是當前pointer對應(yīng)的事件。

MotionEvent事件捆綁

結(jié)合上面的概念,再來說一下MotionEvent的捆綁。為了處理效率,安卓中會把MOVE動作中多個坐標點捆綁在一個MotionEvent中,對于單個手指操作,getX返回的是最近一點的坐標,getHistoricalX 返回的是之前的坐標??聪旅嬉欢未a:

 void printSamples(MotionEvent ev) {
   //獲取MotionEvent中捆綁的坐標點
   final int historySize = ev.getHistorySize();
   //獲取手指數(shù)目
   final int pointerCount = ev.getPointerCount();
   for (int h = 0; h < historySize; h++) {
     System.out.printf("At time %d:", ev.getHistoricalEventTime(h));
     for (int p = 0; p < pointerCount; p++) {
       System.out.printf(" pointer %d: (%f,%f)",
         ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
     }
   }
 }

可以看到,一個MotionEvent中,可能包括多個手指的動作信息,以及一些歷史信息。

事件分發(fā)機制

MotionEvent代表觸摸后響應(yīng)的事件,安卓中的視圖是按照視圖樹構(gòu)建而成的,點擊之后,會生成點擊事件MotionEvent并沿樹傳遞。

與事件分發(fā)有關(guān)的方法有:
public boolean dispatchTouchEvent(MotionEvent ev) 事件分發(fā)
public boolean onInterceptTouchEvent(MotionEvent ev) 事件攔截
public boolean onTouchEvent(MotionEvent ev) 事件響應(yīng)

在一個ViewGroup中通常會具有以上三個方法,可以進行事件的分發(fā)、攔截和響應(yīng),而在一個View中因為沒有子View,所以只能進行事件的處理,也就只有onTouchEvent方法。

dispatchTouchEvent

事件分發(fā)的過程中,會以深度遍歷的方式進行分發(fā)。分以下情況:

返回true,則事件會分發(fā)給當前View,由當前View消費。
返回false,將事件返回給父View進行消費
默認 super.dispatchTouchEvent(ev),會調(diào)用當前View的 onInterceptTouchEvent 進行攔截處理。
一般情況下,我們不會去重寫view的分發(fā)過程,而是著重處理事件的攔截和響應(yīng)。

onInterceptTouchEvent

如果返回true,則攔截當前事件,交由onTouchEvent處理
如果返回false,則不攔截當前事件,交由子View的dispatchTouchEvent處理
如果調(diào)用默認 super.onInterceptTouchEvent,則攔截當前事件。

onTouchEvent

如果返回false,表明當前View無法處理,之間會返回上級有上級View的onTouchEvent處理,一直 向上傳遞直到事件被消費。
如果返回true則會接收并消費該事件
如果返回 super.onTouchEvent(ev) 默認處理事件的邏輯和返回 false 時相同。
注意,對于View而非ViewGroup來說,只具有onTouchEvent方法。所以在一個View中,處理事件響應(yīng)的典型代碼如下:

public class MainActivity extends Activity {
...
// This example shows an Activity, but you would use the same approach if
// you were subclassing a View.
@Override
public boolean onTouchEvent(MotionEvent event){

  int action = MotionEventCompat.getActionMasked(event);

  switch(action) {
    case (MotionEvent.ACTION_DOWN) :
      Log.d(DEBUG_TAG,"Action was DOWN");
      return true;
    case (MotionEvent.ACTION_MOVE) :
      Log.d(DEBUG_TAG,"Action was MOVE");
      return true;
    case (MotionEvent.ACTION_UP) :
      Log.d(DEBUG_TAG,"Action was UP");
      return true;
    case (MotionEvent.ACTION_CANCEL) :
      Log.d(DEBUG_TAG,"Action was CANCEL");
      return true;
    case (MotionEvent.ACTION_OUTSIDE) :
      Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
          "of current screen element");
      return true;
    default :
    //當前View不處理事件,交由上層處理。
      return super.onTouchEvent(event);
  }
}

同樣,一個View處理觸摸事件,還可以設(shè)置監(jiān)聽器onTouchListener,不過要注意的是onTouchListener的優(yōu)先級比onTouch要高,如果其中返回了true,那么將不會調(diào)用onTouch方法。

手勢探測

onTouch中我們可以通過MotionEvent獲取觸摸點的坐標信息,但是關(guān)于某些手勢比如點擊、滑動還需要進行我們自己的邏輯處理。在這里Android本身提供了一些手勢判別的功能。這樣在onTouch方法中,我們只需要把MotionEvent傳遞給手勢監(jiān)聽器處理即可,同時實現(xiàn)接口中相應(yīng)的回調(diào)方法:

private GestureDetectorCompat mDetector;
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mDetector = new GestureDetectorCompat(this,this);
    mDetector.setOnDoubleTapListener(this);
  }
  @Override
  public boolean onTouchEvent(MotionEvent event){
    this.mDetector.onTouchEvent(event);
    // Be sure to call the superclass implementation
    return super.onTouchEvent(event);
  }

如果不需要監(jiān)聽那么多事件,那么可以寫一個監(jiān)聽類繼承GestureDetector.SimpleOnGestureListener并實現(xiàn)其中的方法。

如果要監(jiān)聽觸摸的速度,那么可以通過VelocityTracker來監(jiān)聽:

    switch(action) {
      case MotionEvent.ACTION_DOWN:
        if(mVelocityTracker == null) {         
          mVelocityTracker = VelocityTracker.obtain();
        }
        else {
          mVelocityTracker.clear();
        }
        mVelocityTracker.addMovement(event);
        break;
      case MotionEvent.ACTION_MOVE:
        mVelocityTracker.addMovement(event);
        mVelocityTracker.computeCurrentVelocity(1000);
        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:
        mVelocityTracker.recycle();
        break;

通過將MotionEvent加入VelocityTracker中,可以通過computeCurrentVelocity算出速度。
(未完待續(xù)。。。)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android小程序?qū)崿F(xiàn)音樂播放列表

    Android小程序?qū)崿F(xiàn)音樂播放列表

    這篇文章主要為大家詳細介紹了Android小程序?qū)崿F(xiàn)音樂播放列表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android仿微信雷達掃描效果的實現(xiàn)方法

    Android仿微信雷達掃描效果的實現(xiàn)方法

    最近看了一個視頻講了一種微信雷達掃描的實現(xiàn)方案,借鑒了一下,自己也寫一個玩玩,所以下面這篇文章主要給大家介紹了利用Android模仿微信雷達掃描效果的實現(xiàn)方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • Android下的EXIF是什么

    Android下的EXIF是什么

    這篇文章主要為大家詳細介紹了Android下的EXIF是什么,Exif(Exchangeable Image File 可交換圖像文件)是一種圖象文件格式,它的數(shù)據(jù)存儲與JPEG格式是完全相同的,想要深入了解的朋友可以參考一下
    2016-04-04
  • Android實現(xiàn)抽獎轉(zhuǎn)盤實例代碼

    Android實現(xiàn)抽獎轉(zhuǎn)盤實例代碼

    這篇文章主要介紹了Android實現(xiàn)抽獎轉(zhuǎn)盤實例代碼,可以應(yīng)用于Android游戲開發(fā)中的一個應(yīng)用,需要的朋友可以參考下
    2014-07-07
  • Flutter進階之實現(xiàn)動畫效果(一)

    Flutter進階之實現(xiàn)動畫效果(一)

    這篇文章主要為大家詳細介紹了Flutter實現(xiàn)動畫效果的第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 在Linux下通過命令行打包Android應(yīng)用的方法

    在Linux下通過命令行打包Android應(yīng)用的方法

    這篇文章主要介紹了在Linux下通過命令行打包Android應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Android模擬實現(xiàn)支付寶螞蟻森林效果

    Android模擬實現(xiàn)支付寶螞蟻森林效果

    這篇文章主要為大家詳細介紹了如何利用Android模擬實現(xiàn)支付寶中螞蟻森林的動畫效果,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-09-09
  • Android開發(fā)-之環(huán)境的搭建(圖文詳解)

    Android開發(fā)-之環(huán)境的搭建(圖文詳解)

    這篇文章主要介紹了Android開發(fā)-之環(huán)境的搭建(圖文詳解),具有一定的參考價值,有興趣的可以了解一下。
    2016-11-11
  • 解析Android中實現(xiàn)滑動翻頁之ViewFlipper的使用詳解

    解析Android中實現(xiàn)滑動翻頁之ViewFlipper的使用詳解

    有一些場景,我們需要向用戶展示一系列的頁面。比如我們正在開發(fā)一個看漫畫的應(yīng)用,可能就需要向用戶展示一張一張的漫畫圖片,用戶使用手指滑動屏幕,可以在前一幅漫畫和后一幅漫畫之間切換。這個時候ViewFlipper就是一個很好的選擇
    2013-05-05
  • Android實現(xiàn)基于滑動的SQLite數(shù)據(jù)分頁加載技術(shù)(附demo源碼下載)

    Android實現(xiàn)基于滑動的SQLite數(shù)據(jù)分頁加載技術(shù)(附demo源碼下載)

    這篇文章主要介紹了Android實現(xiàn)基于滑動的SQLite數(shù)據(jù)分頁加載技術(shù),涉及Android針對SQLite數(shù)據(jù)的讀取及查詢結(jié)果的分頁顯示功能相關(guān)實現(xiàn)技巧,末尾還附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-07-07

最新評論

新昌县| 佛坪县| 朝阳区| 普兰县| 西华县| 肃北| 沅陵县| 荔浦县| 梁平县| 洛扎县| 建昌县| 巫山县| 松溪县| 汕尾市| 江都市| 广灵县| 巴林左旗| 泰顺县| 吉隆县| 嘉荫县| 吉首市| 中西区| 张家川| 嘉禾县| 康平县| 扬中市| 峡江县| 精河县| 渭南市| 安吉县| 松滋市| 临潭县| 巴马| 炉霍县| 哈密市| 南充市| 揭东县| 台北县| 正阳县| 台前县| 纳雍县|