【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)
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 | 坐标获取 | 触摸点个数 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android NDK 开发】JNI
- 下一篇: 【Android NDK 开发】JNI