自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android進(jìn)階之view坐標(biāo)系全面詳解

移動開發(fā) Android
說到Android坐標(biāo)系其實就是一個三維坐標(biāo),Z軸向上,X軸向右,Y軸向下。這三維坐標(biāo)的點處理就能構(gòu)成Android豐富的界面或者動畫等效果。

前言

首先祝大家國慶節(jié)快樂,玩的開心;

一、Android坐標(biāo)系詳解

說到Android坐標(biāo)系其實就是一個三維坐標(biāo),Z軸向上,X軸向右,Y軸向下。這三維坐標(biāo)的點處理就能構(gòu)成Android豐富的界面或者動畫等效果;

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絕對相對坐標(biāo)系

View的靜態(tài)坐標(biāo)方法

  • getLeft():返回View自身左邊到父布局左邊的距離;
  • getTop():返回View自身頂邊到父布局頂邊的距離;
  • getRight():返回View自身右邊到父布局左邊的距離;
  • getBottom():返回View自身底邊到父布局頂邊的距離;
  • getX():返回值為getLeft()+getTranslationX(),當(dāng)setTranslationX()時getLeft()不變,getX()變;
  • getY():返回值為getTop()+getTranslationY(),當(dāng)setTranslationY()時getTop()不變,getY()變;

3、手指觸摸屏幕時MotionEvent提供的一些方法

  • getX():當(dāng)前觸摸事件距離當(dāng)前View左邊的距離
  • getY():當(dāng)前觸摸事件距離當(dāng)前View頂邊的距離
  • getRawX():當(dāng)前觸摸事件距離整個屏幕左邊的距離
  • getRawY():當(dāng)前觸摸事件距離整個屏幕頂邊的距離

4、View寬高方法

  • getWidth()layout后有效,返回值是mRight-mLeft;
  • getHeight()layout后有效,返回值是mBottom-mTop;
  • getMeasuredWidth()返回measure過程得到的mMeasuredWidth值;
  • getMeasuredHeight()返回measure過程得到的mMeasuredHeight值;

5、Android View滑動相關(guān)坐標(biāo)系

View的滑動方法

  • offsetLeftAndRight(int offset)|水平方向挪動View,offset為正則x軸正向移動,移動的是整個View,getLeft()會變的,自定義View很有用;
  • offsetTopAndBottom(int offset)|垂直方向挪動View,offset為正則y軸正向移動,移動的是整個View,getTop()會變的,自定義View很有用;
  • scrollTo(int x, int y)|將View中內(nèi)容(不是整個View)滑動到相應(yīng)的位置,參考坐標(biāo)原點為ParentView左上角,x,y為正則向xy軸反方向移動,反之同理;
  • scrollBy(int x, int y)|在scrollTo()的基礎(chǔ)上繼續(xù)滑動xy。
  • setScrollX(int value)|實質(zhì)為scrollTo(),只是只改變Y軸滑動。
  • setScrollY(int value)|實質(zhì)為scrollTo(),只是只改變X軸滑動。
  • getScrollX()/getScrollY()|獲取當(dāng)前滑動位置偏移量。

關(guān)于Android View的scrollBy()和scrollTo()參數(shù)傳遞正數(shù)卻向坐標(biāo)系負(fù)方向移動的特性可能很多人都有疑惑,甚至是死記結(jié)論,這里我們簡單給出產(chǎn)生這種特性的真實原因—-源碼分析,如下:

  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.    } 

View的該方法注釋里明確說明了調(diào)運他會觸發(fā)onScrollChanged()和invalidated()方法,那我們就將矛頭轉(zhuǎn)向invalidated()方法觸發(fā)的draw()過程,draw()過程中最終其實會觸發(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ù)和坐標(biāo)反向的真實原因 
  5.     invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, truefalse); 

核心就在這里

scrollTo()和scrollBy()方法特別注意:如果你給一個ViewGroup調(diào)用scrollTo()方法滾動的是ViewGroup里面的內(nèi)容,如果想滾動一個ViewGroup則再給他嵌套一個外層,滾動外層即可

總結(jié)

 

  • view獲取自身坐標(biāo):getLeft(),getTop(),getRight(),getBottom()
  • view獲取自身寬高:getHeight(),getWidth()
  • motionEvent獲取坐標(biāo):getX(),getY(),getRawX(),getRawY()
  • 然后是motionEvent的方法:
  • getX():獲取點擊事件相對控件左邊的x軸坐標(biāo),即點擊事件距離控件左邊的距離
  • getY():獲取點擊事件相對控件頂邊的y軸坐標(biāo),即點擊事件距離控件頂邊的距離
  • getRawX():獲取點擊事件相對整個屏幕左邊的x軸坐標(biāo),即點擊事件距離整個屏幕左邊的距離
  • getRawY():獲取點擊事件相對整個屏幕頂邊的y軸坐標(biāo),即點擊事件距離整個屏幕頂邊的距離

 

責(zé)任編輯:武曉燕 來源: Android開發(fā)編程
相關(guān)推薦

2013-04-01 13:19:43

iOS定位與坐標(biāo)算法

2021-08-17 13:41:11

AndroidView事件

2023-03-29 07:31:09

WebGL坐標(biāo)系

2023-04-24 09:52:12

2011-06-24 17:38:09

Qt 坐標(biāo) 事件

2011-08-08 17:17:55

Cocos2D 坐標(biāo) OpenglES

2021-08-25 07:43:17

AndroidSurfaceViewTextureView

2021-09-07 06:40:25

AndroidLiveData原理

2021-08-10 20:41:33

AndroidApp流程

2021-09-01 06:48:16

AndroidGlide緩存

2021-09-17 06:55:50

AndroidLayoutView

2021-09-16 06:44:04

Android進(jìn)階流程

2013-05-20 17:33:44

Android游戲開發(fā)自定義View

2021-08-23 06:27:46

AndroidctivitysetContentV

2021-09-02 07:00:01

Glide流程Android

2021-09-30 07:36:51

AndroidViewDraw

2013-07-24 19:04:52

iOS開發(fā)學(xué)習(xí)CGRectInset

2011-08-09 16:25:16

Cocos2d視圖坐標(biāo)

2023-07-07 13:56:01

圖形編輯器畫布縮放

2021-08-11 17:15:17

AndroidActivity場景
點贊
收藏

51CTO技術(shù)棧公眾號