View的基礎(chǔ)需要掌握:
- View的位置參數(shù)
- MotionEvent對象和TouchSlop對象
- VelocityTracker對象
- GestureDetector對象
- Scroller對象
- ..............
1.View的位置參數(shù)
一备徐、Top, Left, Right, Bottom
View的位置主要由它的四個(gè)頂點(diǎn)來決定,分別對應(yīng)于View的四個(gè)屬性: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
//這四個(gè)參數(shù)可以由以下方式獲取
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();
Android3.0后,View增加了x奕坟、y祥款、translationX和translationY這幾個(gè)參數(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)生的一系列點(diǎ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返回的是相對于手機(jī)屏幕左上角的x和y坐標(biāo)。
TouchSlop
TouchSloup是系統(tǒng)所能識別出的被認(rèn)為是滑動的最小距離藐俺,這是一個(gè)常量炊甲,與設(shè)備有關(guān),可通過以下方法獲得:
ViewConfiguration.get(getContext()).getScaledTouchSloup()
3. VelocityTracker對象
速度追蹤欲芹,用于追蹤手指在滑動過程中的速度卿啡,包括水平方向速度和豎直方向速度。 使用方法:
1.在View的onTouchEvent方法中追蹤當(dāng)前單擊事件的速度
VelocityRracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
2.計(jì)算速度菱父,獲得水平速度和豎直速度
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
注意颈娜,獲取速度之前必須先計(jì)算速度,即調(diào)用computeCurrentVelocity方法浙宜,這里指的速度是指一段時(shí)間內(nèi)手指滑過的像素?cái)?shù)官辽,1000指的是1000毫秒,得到的是1000毫秒內(nèi)滑過的像素?cái)?shù)粟瞬。速度可正可負(fù):
速度 = (終點(diǎn)位置 - 起點(diǎn)位置) / 時(shí)間段
最后同仆,當(dāng)不需要使用的時(shí)候,需要調(diào)用clear()方法重置并回收內(nèi)存:
velocityTracker.clear();
velocityTracker.recycle();
4. GestureDetector對象
手勢檢測裙品,用于輔助檢測用戶的單擊俗批、滑動、長按清酥、雙擊等行為扶镀。 使用方法
1.創(chuàng)建一個(gè)GestureDetector對象并實(shí)現(xiàn)OnGestureListener接口,根據(jù)需要焰轻,也可實(shí)現(xiàn)OnDoubleTapListener接口從而監(jiān)聽雙擊行為:
GestureDetector mGestureDetector = new GestureDetector(this);
//解決長按屏幕后無法拖動的現(xiàn)象
mGestureDetector.setIsLongpressEnabled(false);
2.在目標(biāo)View的OnTouchEvent方法中添加以下實(shí)現(xiàn)臭觉,便可接管目標(biāo)View的onTouchEvent 方法:
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
實(shí)現(xiàn)OnGestureListener和OnDoubleTapListener接口中的方法,其中常用的方法有:onSingleTapUp(單擊)、onFling(快速滑動)蝠筑、onScroll(拖動)狞膘、onLongPress(長按)和onDoubleTap(雙擊)。 建議:如果只是監(jiān)聽滑動相關(guān)的什乙,可以自己在onTouchEvent中實(shí)現(xiàn)挽封,如果要監(jiān)聽雙擊這種行為,那么就使用GestureDetector臣镣。
5. Scroller對象
彈性滑動對象辅愿,用于實(shí)現(xiàn)View的彈性滑動,可以實(shí)現(xiàn)有過度的滑動忆某。其本身無法讓View自行滑動点待,需要和View的computeScroll方法配合使用才能完成這個(gè)功能。 使用方法:
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();
}
}