之前總結過一篇關于view的文章,本文更多的是總結了一些常用MotionEvent的相關知識。
MotionEvent的產(chǎn)生
簡單翻譯就是移動事件,觸摸事件等等。就是當用戶的手指在屏幕上操作的時候產(chǎn)生了一個MotionEvent對象。這個對象里包含了觸摸的位置及時間等信息。
獲取MotionEvent對象
- 在Activity中重載 onTouchEvent 方法
- 調(diào)用某個View的.setOnTouchListener并實現(xiàn)onTouch方法。(這里的View
首字母大寫了,是泛指所有繼承View類的控件)
MotionEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
這個函數(shù)的返回值是一個boolean型的。關于返回值的問題,之后我們會在另外的文章中討論。但是它的基本原則就是:如果return true,那么表示該方法消費了此次事件,如果return false,那么表示該方法并未處理完全,該事件仍然需要以某種方式傳遞下去繼續(xù)等待處理。關于這個方法的描述:Return true if you have consumed the event, false if you haven't. The default implementation always returns false.
event.getXXX();
- getAction()方法返回的是int類型,用到的只有低16位,其中:低八位是動作的類型,高8位是觸摸點索引值的表示(單點為0,雙點為1)
獲得動作類型的倆種方法
int action = event.getAction() & MotionEvent.ACTION_MASK;
int action2 = event.getActionMasked();
獲得觸摸點索引類型的倆種方法
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pointerIndex2 = event.getActionIndex();
- 事件發(fā)生的位置
event.getX();Returns the X coordinate of this event for the given pointer。
event.getY();
event.getRawX();Returns the original raw X coordinate of this event。
event.getRawY();
這倆組方法的區(qū)別就在于:
getX() 返回的是相對于當前view左上角的X坐標;
而getRawX返回的是相對于手機屏幕上左上角的X坐標。
- 事件發(fā)生的時間
event.getDownTime(); 按下時的時間
event.getEventTime(); 事件發(fā)生的當前時間
- 事件的類型
switch(action) {
case MotionEvent.ACTION_DOWN: break;
case MotionEvent.ACTION_MOVE: break;
case MotionEvent.ACTION_UP: break;
}
這是三種事件最常用的類型,當然還有一些其他的類型。
- 關于
MotionEvent提供的方法中,和事件類型中,會有Pointer的概念,比如getPointerId()和ACTION_POINTER_DOWN。pointer是什么呢?其實一個pointer就是一個觸摸點。如果還是不能理解,就直接可以理解為一個pointer就是一個手指。大家都知道android的觸摸可以分為單點觸摸和多點觸摸,而pointer就是區(qū)分這倆種情況的。
關于這部分內(nèi)容大家可以看這里的一篇帖子。
VelocityTracker 滑動速度?
// 第一步 在View的 onTouchEvent方法中追蹤當前單擊事件的速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
// 第二步 計算速度
velocityTracker.computeCurrentVelocity(1000);
// 獲取X軸和Y軸上的速度
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
// 重置和回收內(nèi)存
velocityTracker.clear();
velocityTracker.recycle();