View
View是Android中所有控制元件的基類,即使是ViewGroup也是繼承View,也就是說View本身就可以是單個控制元件也可以是多個控制元件組成的一組控制元件,通過這種關係形成了View的結構。
View的位置引數
View的位置主要由它的四個定點來決定,分別對應View的四個屬性:left、top、right、bottom。
left:左上角橫座標;
top:左上角縱座標;
right:右下角橫座標;
bottom:右下角縱座標。
View的寬高和座標關係
width = right - left height = bottom - top
獲取left、top、right、bottom四個引數:
left = getLeft();
top = getTop();
right = getRight();
bottom = getBottom();
複製程式碼
從Android3.0開始增加了額外的幾個引數:x、y、translationX和translationY。 x、y:表示左上角的座標。 translationX、translationY:View左上角相對於父容器的偏移量,預設值為0。
引數換算如下:
x = left + translationX; y = top + translationY。
注意
View在平移過程中,top和left表示的是原始左上角的位置引數資訊,其值並不會發生改變,此時發生改變的是x、y、translationX和translationY這四個引數。
MotionEvent和TouchSlop
在手指接觸螢幕後所產生的一系列事件中,典型的事件型別有如下幾種:
ACTION_DOWN:手指剛接觸螢幕;
ACTION_MOVE:手指在螢幕上移動;
ACTION_UP:手指在螢幕上鬆開的一瞬間。
觸控螢幕發生的事件序列情況:
點選螢幕後鬆開:DOWN——>UP;
點選螢幕滑動一會後鬆開:DOWN——>MOVE——>.....——>MOVE——>UP
以上的典型事件序列,同時可以通過MotionEvent物件可以得到點選事件發生的x、y座標。
getX()和getY():相對於當前View左上角的x和y的座標。
getRawX()和getRawY():相對於手機螢幕左上角的x和y座標。
TouchSlop
TouchSlop是系統所能識別出的,被認為是滑動的最小距離,也就是說手指在螢幕上滑動,如果兩次滑動間的距離小於這個常量,那麼系統就不認為你是在進行滑動操作。
TouchSlop是一個常量,跟裝置有關,可以通過ViewConfiguration.get(getContext() ).getScaledTouchSlop()。
TouchSlop意義
當處理滑動時,我們可以利用這個常量做一些過濾。如兩次的滑動事件的距離小於這個值,我們就認為未達到滑動距離的臨界值,因此就可以認為他們不滑動,這樣可以有更好的使用者體驗。
VelocityTracker、GestureDetector和Scroller
VelocityTracker
速度追蹤,用於追蹤手指在滑動過程中的速度,包括水平和垂直方向的速度。
使用: 1、在view的onTouchEvent方法中追蹤當前單擊事件的速度:
VelocityTracker velocityTracker = VelocityTracker.obtain(); velocityTracker.addMovement(event);
2、獲取當前速度
velocityTracker.computeCurrentVelocity(1000); int xVelocity = (int) velocityTracker.getXVelocity(); int yVelocity = (int) velocityTracker.getYVelocity();
在這一步需要注意兩點:
1)獲取速度之前必須先計算速度,即getXVelocity()和getYVelocity()之前必須呼叫computeCurrentVelocity方法;
2)這裡的速度一般是指一段時間內手指滑過的畫素數,比如將時間間隔設為1000ms時,在1s內,手指在水平方向上從左向右滑過100畫素,那麼水平速度就是100,注意速度可以為負數,當手指從右向左滑動時,水平方向速隊即為負數。
速度 = (終點位置 - 初始位置)/ 時間段
3、當不需要使用它的時候,需要呼叫clear方法來重置並回收記憶體。
velocityTracker.clear(); velocityTracker.recycle();
以上就是使用VelocityTracker物件的全過程。
GestureDetector
手勢檢測,用於輔助檢測使用者的單擊、滑動、長按、雙擊等行為。
使用: 1、建立GestureDetector物件並實現OnGestureListener介面,根據需要我們還可以實現OnDoubleTapListener從而能夠監聽雙擊行為:
GestureDetector mGestureDetector = new GestureDetector(this); mGestureDetector.setIsLongpressEnabled(false);
2、接管目標View等onTouchEvent方法,在監聽view的onTouchEvent方法中新增如下實現:
boolean consume = mGestureDetector.onTouchEvent(event); return consume;
3、完成了以上兩步就可以有選擇的實現OnGestureListener和OnDoubleTapListener中的方法了。
Scroller
彈性滑動物件,用於實現View的彈性滑動,當我們使用view的srollTo/scrollBy方法來進行滑動時,其過程是瞬間完成的,沒有過度效果的滑動使用者體驗不好,這時候使用Scroller來實現有過渡效果的滑動,其過程不是瞬間完成的,而是在一定時間間隔內完成的。Scroller本身無法讓view彈性滑動,需要和View的computeScroll方法配合使用才能共同完成這個功能。
典型使用程式碼:
Scroller scroller = new Scroller(mContext);
//緩慢滾動到指定位置
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int delta = destX-scrollX;
//1000s內滑向destX,效果就是滿滿滑動
scroller.startSroll(scrollX,0,delta,0,1000);
invalidate();
}
@override
public void computeScroll(){
if(scroller.computeScrollOffset()){
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
}
}
複製程式碼