日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Android進(jìn)階之view坐標(biāo)系全面詳解

前言

首先祝大家國(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ū)域的寬高等尺寸獲取

 
 
 
 
  1. DisplayMetrics metrics = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(metrics);
  3. int widthPixels = metrics.widthPixels;
  4. int heightPixels = metrics.heightPixels;

②應(yīng)用程序App區(qū)域?qū)捀叩瘸叽绔@取

 
 
 
 
  1. Rect rect = new Rect();
  2. getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

③獲取狀態(tài)欄高度

 
 
 
 
  1. Rect rect= new Rect();
  2. getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
  3. int statusBarHeight = rectangle.top;

④View布局區(qū)域?qū)捀叩瘸叽绔@取

 
 
 
 
  1. Rect rect = new Rect();
  2. 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í)原因—-源碼分析,如下:

 
 
 
 
  1. public void scrollTo(int x, int y) {
  2.     if (mScrollX != x || mScrollY != y) {
  3.        int oldX = mScrollX;
  4.        int oldY = mScrollY;
  5.        mScrollX = x;
  6.        mScrollY = y;
  7.        invalidateParentCaches();
  8.        onScrollChanged(mScrollX, mScrollY, oldX, oldY);
  9.        if (!awakenScrollBars()) {
  10.          postInvalidateOnAnimation();
  11.        }
  12.    }
  13. }

View的該方法注釋里明確說(shuō)明了調(diào)運(yùn)他會(huì)觸發(fā)onScrollChanged()和invalidated()方法,那我們就將矛頭轉(zhuǎn)向invalidated()方法觸發(fā)的draw()過(guò)程,draw()過(guò)程中最終其實(shí)會(huì)觸發(fā)下面的invalidate()方法,如下:

 
 
 
 
  1. public void invalidate(int l, int t, int r, int b) {
  2.     final int scrollX = mScrollX;
  3.     final int scrollY = mScrollY;
  4.     //scroller時(shí)為何參數(shù)和坐標(biāo)反向的真實(shí)原因
  5.     invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
  6. }

核心就在這里

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