首先管引,什么是View闸迷?在Android中嵌纲,幾乎所有的控件都繼承自View,他是絕大部分控件的基類(lèi)稿黍。包括常用的Button疹瘦、TextView等以及RelativeLayout、LinearLayout等都是View巡球,當(dāng)然后者應(yīng)當(dāng)更加屬于ViewGroup言沐。ViewGroup內(nèi)部是可以存在子View的邓嘹,當(dāng)然這個(gè)子View也還是可以是ViewGroup。
一险胰、View位置相關(guān)
View的位置由他四個(gè)頂點(diǎn)坐標(biāo)決定汹押,分別是top、left起便、right棚贾、bottom,其中需要注意的是top和bottom分別是左上角和右下角的縱坐標(biāo)榆综,而left和right分別是左上角和右下角的橫坐標(biāo)妙痹。
他們直接的關(guān)系為:width=right - left,height = bottom - top鼻疮。從3.0開(kāi)始怯伊,View增加了幾個(gè)額外的參數(shù),分別是x判沟、y耿芹、translationX和translationY,其中x挪哄、y分別是View的左上角坐標(biāo)涮母,translationX和translationY分別是View左上角相對(duì)于父容器的偏移量硕勿。
二这难、MotionEvent和TouchSlop
MotionEvent中比較重要的是:ACTION_DOWN(手指接觸屏幕)裂垦、ACTION_MOVE(手指在屏幕上移動(dòng))、ACTION_UP(手指從屏幕上松開(kāi)的一瞬間)疗涉。
可以通過(guò)MotionEvent可以得到點(diǎn)擊事件的x和y坐標(biāo)拿霉,getX/getY返回相對(duì)于View左上角的x和y坐標(biāo),getRawX/getRawY得到相對(duì)于屏幕左上角的x和y坐標(biāo)咱扣。
TouchSlop是系統(tǒng)中最小滑動(dòng)量绽淘,不同設(shè)備下可能不同。我們可以通ViewConfiguration.get(getContext()).getScaledTouchSlop()來(lái)獲取這個(gè)值闹伪。當(dāng)滑動(dòng)距離小于這個(gè)值時(shí)沪铭,系統(tǒng)可以認(rèn)為并沒(méi)有發(fā)生滑動(dòng)事件,我們也可以通過(guò)這個(gè)值來(lái)過(guò)濾一部分用戶(hù)可能發(fā)生的誤操作偏瓤。
三杀怠、手勢(shì)和滑動(dòng)
Velocity,追蹤速度厅克。用于追蹤手指在滑動(dòng)過(guò)程中的速度赔退,包括水平和豎直方向的速度。
VelocityTracker tracker = VelocityTracker.obtain();
tracker.addMovement(event);
//當(dāng)我們想知道當(dāng)前的滑動(dòng)速度時(shí),我們直接使用以下方法
tracker.computeCurrentVelocity(1000);
int xV = (int)tracker.getXVelocity();
int yV = (int)tracker.getYVelocity();
需要注意的是硕旗,當(dāng)你的手指從右往左滑動(dòng)的時(shí)候窗骑,水平方向?yàn)樨?fù)值,從下往上滑動(dòng)也是同理漆枚。最后在不用的時(shí)候我們依舊還是需要調(diào)用clear方法來(lái)重置并回收內(nèi)存创译。
tracker.clear();
tracker.recycle();
GestureDetector,手勢(shì)檢查墙基。用于輔助檢測(cè)用戶(hù)的點(diǎn)擊软族、滑動(dòng)、長(zhǎng)按残制、雙擊等基礎(chǔ)行為立砸。使用過(guò)程參考如下
//先創(chuàng)建一個(gè)GestureDetector對(duì)象,并且實(shí)現(xiàn)OnGestureListener接口初茶,
//也可以根據(jù)需要實(shí)現(xiàn)OnDoubleTapListener從而能監(jiān)聽(tīng)雙擊行為
GestureDetector mDetector = new GestureDetector(this)仰禽;
//解決長(zhǎng)屏幕后無(wú)法拖動(dòng)現(xiàn)象
mDetector.setInsLongpressEnabled(false);
//接著接管目標(biāo)View的onTouchEvent方法,在待監(jiān)聽(tīng)View的onTouchEvent方法中添加如下實(shí)現(xiàn):
boolean consume = mDetector.onTouchEvent(event);
return consume;
未完待續(xù)...