日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )

發布時間:2025/6/17 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • I . 多點觸控事件
        • II . PointerId 與 PointerIndex 簡介
        • III . 本次 PointerId 與 PointerIndex 獲取
        • IV . PointerId 與 PointerIndex 互相轉化
        • V . 觸摸點個數獲取 ( getPointerCount )
        • VI . 觸摸點坐標獲取
        • VII . 多點觸控 示例代碼 ( 參考 )



I . 多點觸控事件



1 . 多點觸控事件 :


① ACTION_DOWN : 第一個手指按下

② ACTION_MOVE : 所有的手指移動

③ ACTION_UP : 最后一個手指抬起

④ ACTION_POINTER_DOWN : 中間的手指按下 ( 已經有手指按下 )

⑤ ACTION_POINTER_UP : 中間手指抬起 ( 還有手指在觸摸中 )


2 . 獲取多點觸控事件 : 調用 MotionEvent 對象的 getActionMasked() 可以獲取多點觸控事件 , 即上面的 5 種觸摸事件 ;


3 . 獲取并處理多點觸控事件代碼示例 :


① 獲取多點觸控事件 :

//獲取當前的多點觸控觸摸事件 int actionMasked = event.getActionMasked();

② 處理多點觸控事件 :

//處理 5種多點觸控事件 switch (actionMasked){case MotionEvent.ACTION_DOWN : //第一個手指按下break;case MotionEvent.ACTION_MOVE : //手指移動break;case MotionEvent.ACTION_UP : //最后一個手指抬起break;case MotionEvent.ACTION_POINTER_DOWN : //中間的手指按下 ( 已經有手指按下 )break;case MotionEvent.ACTION_POINTER_UP : //中間手指抬起 ( 還有手指在觸摸中 )break;}

II . PointerId 與 PointerIndex 簡介



1 . Pointer 觸摸點 :


① PointerId : 觸摸點標識 , 一旦賦值不可更改 ;

手指按下 , 該觸摸點產生 自帶觸摸點 ID 屬性 , 以及分配一個觸摸點索引 , 當手指抬起 , 該觸摸點 ID 值回收 ; 期間觸摸點 ID 不會改變 ;

② PointerIndex : 觸摸點索引 , 觸摸點的索引值可能會變 ;

該值從 0 開始計數 , 取值范圍是 0 ~ 觸摸點個數 - 1 , 每當有一個中間觸摸點抬起 , 后面的觸摸點就會依次替補該空缺 ;


2 . MotionEvent 與 Pointer 觸摸點關系 :

MotionEvent 對象中存儲多個觸摸點信息 , 每個觸摸點都有 PointerId ( 觸摸點標識 ) 和 PointerIndex ( 觸摸點索引 ) 兩個屬性 ;


3 . PointerId 與 PointerIndex 運行機制 :

PointerId 觸摸點 ID 標識 , 只要按下 , 不抬起 , 值不變 , 如果中間手指抬起 , 那么出現中間的 ID 空置的情況 ; 3 個手指按下 , PointerId 分別是 0, 1 , 2 ;中間的抬起 , 那么 PointerId 的 ID 值會空著 , 兩個手指的 ID 分別是 0 和 2 ;

PointerIndex 觸摸點索引值 , 3 個手指按下 , 索引值依次是 0 , 1 , 2 , 如果第二個手指抬起 , 后續的第三個的索引會由 2 變成 1 , 順序補位替補上去 ;



III . 本次 PointerId 與 PointerIndex 獲取



① 獲取本次的觸摸事件的 觸摸點 ID :

//獲取本事件對應的 pointerIndex int actionIndex = event.getActionIndex();

② 獲取本次觸摸事件的 觸摸點 索引 :

//4 . 獲取 actionIndex 對應的 PointerId int pointerId = event.getPointerId(actionIndex);

IV . PointerId 與 PointerIndex 互相轉化



PointerId 與 PointerIndex 關聯 及 轉化關系 :


① 兩者特點 : PointerId 是固定不變的 , PointerIndex 有順序補位的特征 , 是不確定的 ;

② PointerId -> PointerIndex : 通過調用 MotionEvent 對象的 findPointerIndex(int pointerId) 方法可以獲取指定 pointerId 對應的 PointerIndex 值 ;

③ PointerIndex -> PointerId : 通過調用 MotionEvent 對象的 getPointerId(int pointerIndex) 方法可以獲取指定 PointerIndex 對應的 pointerId 值 ;


//3 . 獲取 PointerId 對應的 PointerIndex // 查找 ID值 對應的索引值 int pointerIndex = event.findPointerIndex(PointerId); ... // 獲取 索引值 對應的 ID 值 int PointerId = event.getPointerId(PointerIndex)

V . 觸摸點個數獲取 ( getPointerCount )



獲取當前觸摸點個數 :

//獲取當前觸摸點個數 int pointCount = event.getPointerCount();

VI . 觸摸點坐標獲取



獲取觸摸點坐標 :


① 獲取當前觸摸事件坐標 :

public final float getX()
public final float getY()


② 獲取指定觸摸點索引 PointerIndex 坐標 : ( 注意不是觸摸點標識 )

public final float getX(int pointerIndex)
public final float getY(int pointerIndex)

//1 . 獲取 坐標//1.1 獲取 當前 觸摸 事件的 x y 坐標 float x = event.getX(); float y = event.getY();//1.2 獲取 指定 pointerIndex 的 x y 坐標 ( 獲取第 0 個索引的坐標 ) int pointerIndex = 0; float x_pointer = event.getX(pointerIndex); float y_pointer = event.getY(pointerIndex);

VII . 多點觸控 示例代碼 ( 參考 )



package kim.hsl.multitouch;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log; import android.view.MotionEvent;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onTouchEvent(MotionEvent event) {//多點觸控示例/*1 . 多點觸控事件 :多點觸控事件 Action 由 pointerIndex 和 動作碼 進行或運算 合成調用 event.getActionMasked() 即可獲取動作碼 , 屏蔽 pointerIndex 觸摸索引2 . PointerId 和 PointerIndex :Pointer 就是觸摸點 ;兩個值的特點 :PointerId : 唯一性的表示一個觸摸點 , 該值如果觸摸上 , 任意移動 , 只要不抬起 , 就不變 ;PointerIndex : 觸摸點的索引 , 是一個從 0 開始計數的連續的數值 , 同樣是第 0 個索引 , 代表的可能是不同觸摸點 ;運行機制 :PointerId : 只要按下 , 不抬起 , 值不變 , 如果中間手指抬起 , 那么出現中空的情況 ;3 個手指按下 , PointerId 分別是 1 , 2 , 3 ;中間的抬起 , 那么 PointerId 的 ID 值會空著 , 兩個手指的 ID 分別是 1 和 3PointerIndex : 3 個手指按下 , 如果第二個手指抬起 , 后續的第三個的索引會由 2 變成 1 , 順序補位替補上去PointerId 與 PointerIndex 轉換換 :pointerId 是確定的 , PointerIndex 有順序補位的特征 , 是不確定的通過 findPointerIndex(int pointerId) 方法可以獲取指定 pointerId 的 PointerIndex 值3 . 獲取坐標 :獲取當前坐標 : event.getX();獲取指定 pointerIndex 坐標 : event.getX(pointerIndex);4 . 多點觸控的 5 種事件 :單點觸控需要處理 ACTION_DOWN , ACTION_MOVE , ACTION_UP多點觸控需要處理 ACTION_DOWN , ACTION_MOVE , ACTION_UP , ACTION_POINTER_DOWN , ACTION_POINTER_UP多點觸控中這些動作有不同的含義 :ACTION_DOWN : 第一個手指按下ACTION_MOVE : 所有的手指滑動事件ACTION_UP : 最后一個手指抬起ACTION_POINTER_DOWN : 中間的手指按下 ( 已經有手指按下 )ACTION_POINTER_UP : 中間手指抬起 ( 還有手指在觸摸中 )5 . 多點觸控與單點觸控對比多了兩個事件 ACTION_POINTER_DOWN 和 ACTION_POINTER_UP多了觸摸點 ID 標識與觸摸點索引機制*///1 . 獲取 坐標//1.1 獲取 當前 觸摸 事件的 x y 坐標float x = event.getX();float y = event.getY();//1.2 獲取 指定 pointerIndex 的 x y 坐標 ( 獲取第 0 個索引的坐標 )int pointerIndex = 0;float x_pointer = event.getX(pointerIndex);float y_pointer = event.getY(pointerIndex);//2 . 獲取 觸摸事件 相關屬性//獲取當前的多點觸控觸摸事件int actionMasked = event.getActionMasked();//獲取本事件對應的 pointerIndexint actionIndex = event.getActionIndex();//獲取當前觸摸點個數int pointCount = event.getPointerCount();//3 . 獲取 PointerId 對應的 PointerIndex// 查找第 1 個按下的手指的索引值pointerIndex = event.findPointerIndex(0);//4 . 處理對應的事件操作switch (actionMasked){case MotionEvent.ACTION_DOWN : //第一個手指按下Log.i("TAG", "ACTION_DOWN : 第一個手指按下");break;case MotionEvent.ACTION_MOVE : //手指移動Log.i("TAG", "ACTION_MOVE : 手指移動");break;case MotionEvent.ACTION_UP : //最后一個手指抬起Log.i("TAG", "ACTION_UP : 最后一個手指抬起");break;case MotionEvent.ACTION_POINTER_DOWN : //中間的手指按下 ( 已經有手指按下 )Log.i("TAG", "ACTION_POINTER_DOWN : 中間的手指按下 ( 已經有手指按下 )");break;case MotionEvent.ACTION_POINTER_UP : //中間手指抬起 ( 還有手指在觸摸中 )Log.i("TAG", "ACTION_POINTER_UP : 中間手指抬起 ( 還有手指在觸摸中 )");break;}return true;} }

總結

以上是生活随笔為你收集整理的【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。