成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android進階之view坐標系全面詳解

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

前言

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

一、Android坐標系詳解

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

1、Android屏幕一些值的獲取

①獲取屏幕區(qū)域的寬高等尺寸獲取

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

②應用程序App區(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ū)域寬高等尺寸獲取

  1. Rect rect = new Rect(); 
  2. getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect); 

2、Android View絕對相對坐標系

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

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

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

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

4、View寬高方法

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

5、Android View滑動相關坐標系

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)滑動到相應的位置,參考坐標原點為ParentView左上角,x,y為正則向xy軸反方向移動,反之同理;
  • scrollBy(int x, int y)|在scrollTo()的基礎上繼續(xù)滑動xy。
  • setScrollX(int value)|實質為scrollTo(),只是只改變Y軸滑動。
  • setScrollY(int value)|實質為scrollTo(),只是只改變X軸滑動。
  • getScrollX()/getScrollY()|獲取當前滑動位置偏移量。

關于Android View的scrollBy()和scrollTo()參數(shù)傳遞正數(shù)卻向坐標系負方向移動的特性可能很多人都有疑惑,甚至是死記結論,這里我們簡單給出產(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的該方法注釋里明確說明了調運他會觸發(fā)onScrollChanged()和invalidated()方法,那我們就將矛頭轉向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ù)和坐標反向的真實原因 
  5.     invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, truefalse); 

核心就在這里

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

總結

 

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

 

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

2021-08-17 13:41:11

AndroidView事件

2013-04-01 13:19:43

iOS定位與坐標算法

2023-03-29 07:31:09

WebGL坐標系

2023-04-24 09:52:12

2011-08-08 17:17:55

Cocos2D 坐標 OpenglES

2011-06-24 17:38:09

Qt 坐標 事件

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-08-23 06:27:46

AndroidctivitysetContentV

2021-09-16 06:44:04

Android進階流程

2013-05-20 17:33:44

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

2021-09-02 07:00:01

Glide流程Android

2021-09-30 07:36:51

AndroidViewDraw

2013-07-24 19:04:52

iOS開發(fā)學習CGRectInset

2021-08-11 17:15:17

AndroidActivity場景

2011-08-09 16:25:16

Cocos2d視圖坐標

2023-07-07 13:56:01

圖形編輯器畫布縮放
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合欧美亚洲 | 欧美一区二区久久 | 欧美成人久久 | 国产高清精品在线 | 爱草在线 | 国产a级黄色录像 | 91视在线国内在线播放酒店 | 久久久一区二区 | 三极网站 | 欧美日韩在线精品 | 一区二区三区中文字幕 | 精品亚洲一区二区 | 免费看淫片 | 国产xxxx搡xxxxx搡麻豆 | 久久久久久亚洲精品 | 欧美理论片在线观看 | 国产午夜精品久久久久 | 日本精品视频一区二区 | 一区二区三区四区免费在线观看 | 亚洲精品一区二区三区 | 久久精品青青大伊人av | 国产特黄一级 | 国产91一区 | 奇米av| 日韩三区| 久久不卡| 免费午夜电影 | 成人影院一区二区三区 | 日日夜夜精品视频 | 日韩午夜精品 | 国产高清视频在线 | 久久精品青青大伊人av | 欧美国产日韩在线观看 | 亚洲精品日韩在线 | 久久久久久国产免费视网址 | 国产在线激情视频 | 一级毛片在线播放 | 国产成人精品一区二三区在线观看 | 久久午夜视频 | 在线成人免费观看 | 在线观看免费观看在线91 |