新聞中心
前言
首先祝大家國(guó)慶節(jié)快樂(lè),玩的開心;

一、Android坐標(biāo)系詳解
說(shuō)到Android坐標(biāo)系其實(shí)就是一個(gè)三維坐標(biāo),Z軸向上,X軸向右,Y軸向下。這三維坐標(biāo)的點(diǎn)處理就能構(gòu)成Android豐富的界面或者動(dòng)畫等效果;
1、Android屏幕一些值的獲取
①獲取屏幕區(qū)域的寬高等尺寸獲取
- DisplayMetrics metrics = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(metrics);
- int widthPixels = metrics.widthPixels;
- int heightPixels = metrics.heightPixels;
②應(yīng)用程序App區(qū)域?qū)捀叩瘸叽绔@取
- Rect rect = new Rect();
- getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
③獲取狀態(tài)欄高度
- Rect rect= new Rect();
- getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
- int statusBarHeight = rectangle.top;
④View布局區(qū)域?qū)捀叩瘸叽绔@取
- Rect rect = new Rect();
- getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);
2、Android View絕對(duì)相對(duì)坐標(biāo)系
View的靜態(tài)坐標(biāo)方法
- getLeft():返回View自身左邊到父布局左邊的距離;
- getTop():返回View自身頂邊到父布局頂邊的距離;
- getRight():返回View自身右邊到父布局左邊的距離;
- getBottom():返回View自身底邊到父布局頂邊的距離;
- getX():返回值為getLeft()+getTranslationX(),當(dāng)setTranslationX()時(shí)getLeft()不變,getX()變;
- getY():返回值為getTop()+getTranslationY(),當(dāng)setTranslationY()時(shí)getTop()不變,getY()變;
3、手指觸摸屏幕時(shí)MotionEvent提供的一些方法
- getX():當(dāng)前觸摸事件距離當(dāng)前View左邊的距離
- getY():當(dāng)前觸摸事件距離當(dāng)前View頂邊的距離
- getRawX():當(dāng)前觸摸事件距離整個(gè)屏幕左邊的距離
- getRawY():當(dāng)前觸摸事件距離整個(gè)屏幕頂邊的距離
4、View寬高方法
- getWidth()layout后有效,返回值是mRight-mLeft;
- getHeight()layout后有效,返回值是mBottom-mTop;
- getMeasuredWidth()返回measure過(guò)程得到的mMeasuredWidth值;
- getMeasuredHeight()返回measure過(guò)程得到的mMeasuredHeight值;
5、Android View滑動(dòng)相關(guān)坐標(biāo)系
View的滑動(dòng)方法
- offsetLeftAndRight(int offset)|水平方向挪動(dòng)View,offset為正則x軸正向移動(dòng),移動(dòng)的是整個(gè)View,getLeft()會(huì)變的,自定義View很有用;
- offsetTopAndBottom(int offset)|垂直方向挪動(dòng)View,offset為正則y軸正向移動(dòng),移動(dòng)的是整個(gè)View,getTop()會(huì)變的,自定義View很有用;
- scrollTo(int x, int y)|將View中內(nèi)容(不是整個(gè)View)滑動(dòng)到相應(yīng)的位置,參考坐標(biāo)原點(diǎn)為ParentView左上角,x,y為正則向xy軸反方向移動(dòng),反之同理;
- scrollBy(int x, int y)|在scrollTo()的基礎(chǔ)上繼續(xù)滑動(dòng)xy。
- setScrollX(int value)|實(shí)質(zhì)為scrollTo(),只是只改變Y軸滑動(dòng)。
- setScrollY(int value)|實(shí)質(zhì)為scrollTo(),只是只改變X軸滑動(dòng)。
- getScrollX()/getScrollY()|獲取當(dāng)前滑動(dòng)位置偏移量。
關(guān)于Android View的scrollBy()和scrollTo()參數(shù)傳遞正數(shù)卻向坐標(biāo)系負(fù)方向移動(dòng)的特性可能很多人都有疑惑,甚至是死記結(jié)論,這里我們簡(jiǎn)單給出產(chǎn)生這種特性的真實(shí)原因—-源碼分析,如下:
- public void scrollTo(int x, int y) {
- if (mScrollX != x || mScrollY != y) {
- int oldX = mScrollX;
- int oldY = mScrollY;
- mScrollX = x;
- mScrollY = y;
- invalidateParentCaches();
- onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- if (!awakenScrollBars()) {
- postInvalidateOnAnimation();
- }
- }
- }
View的該方法注釋里明確說(shuō)明了調(diào)運(yùn)他會(huì)觸發(fā)onScrollChanged()和invalidated()方法,那我們就將矛頭轉(zhuǎn)向invalidated()方法觸發(fā)的draw()過(guò)程,draw()過(guò)程中最終其實(shí)會(huì)觸發(fā)下面的invalidate()方法,如下:
- public void invalidate(int l, int t, int r, int b) {
- final int scrollX = mScrollX;
- final int scrollY = mScrollY;
- //scroller時(shí)為何參數(shù)和坐標(biāo)反向的真實(shí)原因
- invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
- }
核心就在這里
scrollTo()和scrollBy()方法特別注意:如果你給一個(gè)ViewGroup調(diào)用scrollTo()方法滾動(dòng)的是ViewGroup里面的內(nèi)容,如果想滾動(dòng)一個(gè)ViewGroup則再給他嵌套一個(gè)外層,滾動(dòng)外層即可
總結(jié)
- view獲取自身坐標(biāo):getLeft(),getTop(),getRight(),getBottom()
- view獲取自身寬高:getHeight(),getWidth()
- motionEvent獲取坐標(biāo):getX(),getY(),getRawX(),getRawY()
- 然后是motionEvent的方法:
- getX():獲取點(diǎn)擊事件相對(duì)控件左邊的x軸坐標(biāo),即點(diǎn)擊事件距離控件左邊的距離
- getY():獲取點(diǎn)擊事件相對(duì)控件頂邊的y軸坐標(biāo),即點(diǎn)擊事件距離控件頂邊的距離
- getRawX():獲取點(diǎn)擊事件相對(duì)整個(gè)屏幕左邊的x軸坐標(biāo),即點(diǎn)擊事件距離整個(gè)屏幕左邊的距離
- getRawY():獲取點(diǎn)擊事件相對(duì)整個(gè)屏幕頂邊的y軸坐標(biāo),即點(diǎn)擊事件距離整個(gè)屏幕頂邊的距離
當(dāng)前標(biāo)題:Android進(jìn)階之view坐標(biāo)系全面詳解
網(wǎng)站鏈接:http://www.5511xx.com/article/cdchdei.html


咨詢
建站咨詢
