View
- View的left,top,bottom,right對(duì)應(yīng)于源碼中的mLeft,mTop,mBottom,mRight,
是相對(duì)于父容器而言的抛人。獲取方式箱沦,getLeft(),getTop,getRight(),getBottom()
- 從Android 3.0開始磷支,View增加了幾個(gè)額外參數(shù)侯繁,x,y,translationX和translationY膝昆,也都是相對(duì)于父容器组贺。
x凸舵,y是view的左上角坐標(biāo)
translationX和translationY是相對(duì)于父容器的偏移量,默認(rèn)值為0
關(guān)系:x= left+translationX, y=top+translationY
- 在平移過程中失尖,top和left表示原始左上角坐標(biāo)的位置啊奄,不會(huì)發(fā)生改變,發(fā)生改變的只有x,y,translationX,translationY.
- 通過MotionEvent可以獲得點(diǎn)擊事件發(fā)生的點(diǎn)的x,y坐標(biāo)
getX()/getY() 獲取相當(dāng)于當(dāng)前View左上角的坐標(biāo)
getRawX()/getRowY() 返回相當(dāng)于屏幕的左上角的坐標(biāo)
- TouchSlop 系統(tǒng)所能識(shí)別出的被認(rèn)為是滑動(dòng)的最小距離 p125
獲取方式:
ViewConfiguration.get(getContext()).getScaledTouchSlop();
- VelocityTracker 速度追蹤掀潮,用于追蹤手指在滑動(dòng)過程中的速度菇夸。p126
- GestrueDetector 手勢(shì)檢測(cè),用于輔助檢測(cè)用戶的單擊滑動(dòng)雙擊長按等行為
GestrueDetector mGestrueDetector = new GestrueDetector();
//解決長按屏幕后無法拖動(dòng)現(xiàn)象
mGestrueDetector.setIsLongpressEnable(flase);
//接管目標(biāo)View的onTouchEvent,在onTouchEvent中做如下處理
boolean consume = mGestrueDetector.onTouchEvent(event);
return consume;
- Scroller 彈性滑動(dòng)對(duì)象
需要和View的computeScroll方法配合使用
Scroller scroller = new Scroller(getContext());
private void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000ms 內(nèi)滑向 destX,效果就是慢慢滑動(dòng)
scroller.startScroll(scrollX, 0, delta, 0, 1000);
invalidate();
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
}
}
- scrollTo,scrollBy只能改變View的內(nèi)容位置仪吧,而不能改變View在布局中的位置
mScrollX指View左邊緣到View內(nèi)容左邊緣的距離庄新,mScrollY同理
View的左邊緣在View內(nèi)容左邊緣的右邊時(shí),mScrollX值為正(從右向左滑動(dòng)),View上邊緣在View內(nèi)容上邊緣的下邊時(shí)择诈,mScroll值為正(從下往上滑動(dòng))械蹋。
獲取方式:getScrollX(),getScrollY()
View事件分發(fā)機(jī)制
如果給一個(gè)View設(shè)置了onTouchListener,那么它的onTouchListener的onTouch方法會(huì)被調(diào)用,這時(shí)就看onTouch的返回值羞芍,如果返回false哗戈,則當(dāng)前View的onTouchEvent會(huì)被調(diào)用,在onTouchEvent中荷科,如果當(dāng)前view設(shè)置有onClickListener唯咬,那么它的onClick方法會(huì)被調(diào)用
由此可見 onTouchListener>onTouchEvent>onClickListenr.
- requestDisallowInteceptTouchEvent()在子元素干預(yù)父元素的事件分發(fā)過程
- Activity的事件分發(fā)過程:
當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí),事件最新傳遞給Activity的dispatchTouchEvent,由它來派發(fā)事件畏浆,具體會(huì)由Activity的Window來進(jìn)行處理胆胰,Window會(huì)將事件傳遞給DecorView,decor view一般就是界面的底層容器,
Activity dispatchTouchEvent源碼分析:
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
如果返回了true則activity的dispatchTouchEvent也就執(zhí)行完畢了全度,如果返回false煮剧,則交由activity onTouchEvent處理。
window中的分發(fā)是由其實(shí)現(xiàn)類phoneWindow來分發(fā)的将鸵。PhoneWindow直接將事件分發(fā)給DecorView(FrameLayout)
-
頂級(jí)容器對(duì)事件的分發(fā)過程
頂級(jí)容器對(duì)事件的分發(fā)過程
- View的onClick事件執(zhí)行是在onTouchEvent中的ACTION_UP中執(zhí)行的勉盅。