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

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

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

前言

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

一、Android坐標系詳解

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

1、Android屏幕一些值的獲取

①獲取屏幕區域的寬高等尺寸獲取

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

②應用程序App區域寬高等尺寸獲取

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

③獲取狀態欄高度

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

④View布局區域寬高等尺寸獲取

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

2、Android View絕對相對坐標系

View的靜態坐標方法

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

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

  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的該方法注釋里明確說明了調運他會觸發onScrollChanged()和invalidated()方法,那我們就將矛頭轉向invalidated()方法觸發的draw()過程,draw()過程中最終其實會觸發下面的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時為何參數和坐標反向的真實原因 
  5.     invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, truefalse); 

核心就在這里

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

總結

 

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

 

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

2013-04-01 13:19:43

iOS定位與坐標算法

2021-08-17 13:41:11

AndroidView事件

2023-03-29 07:31:09

WebGL坐標系

2023-04-24 09:52:12

2011-06-24 17:38:09

Qt 坐標 事件

2011-08-08 17:17:55

Cocos2D 坐標 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進階流程

2013-05-20 17:33:44

Android游戲開發自定義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開發學習CGRectInset

2021-08-11 17:15:17

AndroidActivity場景

2011-08-09 16:25:16

Cocos2d視圖坐標

2023-07-07 13:56:01

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

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美国产精品久久 | 日韩欧美精品一区 | 一区二区在线 | 亚洲69p | 在线观看av不卡 | 一级毛片视频 | 一级黄色片网站 | 自拍偷拍中文字幕 | 性网站免费| 精品一二区 | 亚洲视频一区在线观看 | 国产精品久久性 | 福利国产 | 毛片一区二区三区 | 一区二区三区在线免费观看 | 中文字幕在线视频一区二区三区 | 久久国产综合 | 国产精品片 | 久久久亚洲一区 | 黄色免费在线观看网址 | 国产美女自拍视频 | 国产精品污污视频 | 国产在线中文 | 在线观看免费av网站 | 欧美一区二区三区久久精品视 | 天天澡天天狠天天天做 | 亚洲精品一区二区三区在线 | 亚洲一区 | 91资源在线观看 | 好姑娘高清在线观看电影 | 日本不卡在线视频 | 亚洲成人免费网址 | 成年人在线电影 | 手机在线一区二区三区 | 一级黄色毛片免费 | 91久久精品日日躁夜夜躁国产 | 亚洲网站在线观看 | 亚洲视频免费在线播放 | 色婷婷亚洲一区二区三区 | 国产精品一区三区 | 亚洲成人精品影院 |