View的事件體系(一)View的基礎(chǔ)知識

View的基礎(chǔ)需要掌握:

  1. View的位置參數(shù)
  2. MotionEvent對象和TouchSlop對象
  3. VelocityTracker對象
  4. GestureDetector對象
  5. Scroller對象
  6. ..............

1.View的位置參數(shù)

一、Top, Left, Right, Bottom

View的位置主要由它的四個頂點來決定,分別對應(yīng)于View的四個屬性:top,left,right,bottom,其中top是左上角的縱坐標(biāo),left是左上角的橫坐標(biāo),right是右下角的橫坐標(biāo),bottom是右下角縱坐標(biāo)。但是大家注意,這些坐標(biāo)都是相對于View的父容器來說的,因此它是一種相對坐標(biāo),View的坐標(biāo)和父容器的關(guān)系如下圖(注:在Android中,X軸和Y軸的正方向分別為右和下)

由此得出View的寬高:

width = right - left
height = bottom - top
//這四個參數(shù)可以由以下方式獲取
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();

Android3.0后,View增加了x、y、translationX和translationY這幾個參數(shù)。其中x和y是View左上角的坐標(biāo),而translationX和translationY是View左上角相對于容器的偏移量。
他們之間的換算關(guān)系如下:

x = left + translationX;
y = top + translationY;

注意:View在平移的過程中,top和left表示的是原始左上角的位置信息不會改變,改變的是x、y、translationX和translaY。

二、MotionEvent和TouchSlop

MotionEvent

在手指接觸到屏幕后會產(chǎn)生的一系列點擊事件,如

ACTION_DOWN:手指剛接觸到屏幕

ACTION_MOVE:手指在屏幕上移動

ACTION_UP :手指從屏幕上松開的一瞬間

通過MotionEven對象我們可以得到事件發(fā)生的x和y坐標(biāo),我們可以通過getX/getY和getRawX/getRawY得到,它們的區(qū)別是:getX/getY返回的是相對于當(dāng)前View左上角的x和y坐標(biāo),getRawX/getRawY返回的是相對于手機屏幕左上角的x和y坐標(biāo)。

TouchSlop

TouchSloup是系統(tǒng)所能識別出的被認(rèn)為是滑動的最小距離,這是一個常量,與設(shè)備有關(guān),可通過以下方法獲得:

ViewConfiguration.get(getContext()).getScaledTouchSloup()

3. VelocityTracker對象

速度追蹤,用于追蹤手指在滑動過程中的速度,包括水平方向速度和豎直方向速度。 使用方法:

1.在View的onTouchEvent方法中追蹤當(dāng)前單擊事件的速度

VelocityRracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

2.計算速度,獲得水平速度和豎直速度

velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();

注意,獲取速度之前必須先計算速度,即調(diào)用computeCurrentVelocity方法,這里指的速度是指一段時間內(nèi)手指滑過的像素數(shù),1000指的是1000毫秒,得到的是1000毫秒內(nèi)滑過的像素數(shù)。速度可正可負(fù):

 速度 = (終點位置 - 起點位置) / 時間段

最后,當(dāng)不需要使用的時候,需要調(diào)用clear()方法重置并回收內(nèi)存:

velocityTracker.clear();
velocityTracker.recycle();

4. GestureDetector對象

手勢檢測,用于輔助檢測用戶的單擊、滑動、長按、雙擊等行為。 使用方法

1.創(chuàng)建一個GestureDetector對象并實現(xiàn)OnGestureListener接口,根據(jù)需要,也可實現(xiàn)OnDoubleTapListener接口從而監(jiān)聽雙擊行為:

GestureDetector mGestureDetector = new GestureDetector(this);
//解決長按屏幕后無法拖動的現(xiàn)象
mGestureDetector.setIsLongpressEnabled(false);

2.在目標(biāo)View的OnTouchEvent方法中添加以下實現(xiàn),便可接管目標(biāo)View的onTouchEvent 方法:

boolean consume = mGestureDetector.onTouchEvent(event);
return consume;

實現(xiàn)OnGestureListener和OnDoubleTapListener接口中的方法,其中常用的方法有:onSingleTapUp(單擊)、onFling(快速滑動)、onScroll(拖動)、onLongPress(長按)和onDoubleTap(雙擊)。 建議:如果只是監(jiān)聽滑動相關(guān)的,可以自己在onTouchEvent中實現(xiàn),如果要監(jiān)聽雙擊這種行為,那么就使用GestureDetector。

5. Scroller對象

彈性滑動對象,用于實現(xiàn)View的彈性滑動,可以實現(xiàn)有過度的滑動。其本身無法讓View自行滑動,需要和View的computeScroll方法配合使用才能完成這個功能。 使用方法:

Scroller scroller = new Scroller(mContext);
//緩慢移動到指定位置
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000ms內(nèi)滑向destX,效果就是慢慢滑動
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidata();
}
@Override
public void computeScroll(){
if(mScroller.computeScrollOffset()){
 scrollTo(mScroller.getCurrX,mScroller.getCurrY());
 postInvalidate();
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容