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

Android布局中長度單位的深入研究

移動開發 Android
要想使自己的布局在不同設備達到精準空置,理清理順Android布局長度單位之間關系很有必要,否則你也許會經常撓頭為什么顯示出來的布局不是自己定義的效果呢,有些東西,雖然基礎,但是弄個透徹也需要花些功夫,廢話不多說,下面開始。

要想使自己的布局在不同設備達到精準空置,理清理順Android布局長度單位之間關系很有必要,否則你也許會經常撓頭為什么顯示出來的布局不是自己定義的效果呢,有些東西,雖然基礎,但是弄個透徹也需要花些功夫,廢話不多說,下面開始。

1.先了解一下Android有支持哪些長度單位

px: pixels(像素). 不同設備顯示效果相同,比如我們800*480的屏幕寬度就是 800px

dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,通常屏幕大時,density就大,屏幕小時,density就小

屏幕實際分辨率為240px*400px時,densityDpi=120

屏幕實際分辨率為320px*533px,densityDpi=160

屏幕實際分辨率為480px*800px,densityDpi=240

而dip與px之間的換算關系是:

pixs =dips * (densityDpi/160),也就是說當densityDpi=160時,1dip=1px

sp: scaled pixels(放大像素),sp的大小取決于系統metrics.scaledDensity值大小

pt: point,是一個標準的長度單位,1pt=1/72英寸,用于印刷業(基本用不到)

pt與px的換算關系:pixs = pt*xdpi * (1.0f/72);xdpi表示1英寸像素個數

in(英寸)長度單位(基本用不到)

in與px的換算關系:pixs = in*xdpi

mm(毫米)長度單位(基本用不到)

mm與px的換算關系:pixs = mm * xdpi * (1.0f/25.4f)

2.系統獲取長度單位

看了上面具體長度單位的含義你會產生一個疑問,不同單位換算取決于系統的一些屬性,比如densityDpi的值,xdpi的值,那么系統這些值在哪里獲取了,直接看測試用例:

  1. public void testgetdisplay(){ 
  2. WindowManager wm = (WindowManager) this.getInstrumentation().getContext().getSystemService(Context.WINDOW_SERVICE); 
  3. DisplayMetrics mDisplayMetrics = new DisplayMetrics(); 
  4. wm.getDefaultDisplay().getMetrics(mDisplayMetrics); 
  5. System.out.println("display.height="+wm.getDefaultDisplay().getHeight()); 
  6. System.out.println("display.width="+wm.getDefaultDisplay().getWidth()); 
  7. System.out.println("densityDpi="+mDisplayMetrics.densityDpi); 
  8. System.out.println("xdpi="+mDisplayMetrics.xdpi); 
  9. System.out.println("density="+mDisplayMetrics.density); 

3.densityDpi與drawable-(hdpi,mdpi,ldpi)之間的關系

系統drawable有hdpi,mdpi,ldpi三個文件夾下面存放不同尺寸的圖片,使用哪個文件下的文件,與系統densityDpi值是有關系的。

densityDpi=120:ldpi
densityDpi=160:mdpi
densityDpi=240:hdpi

前面我又說過densityDpi取決于顯示屏,這樣你就了解了為什么不同顯示屏WVGA,HVGA,QVGA會采用不同drawable-(hdpi,mdpi,ldpi)圖片。

分辨率為240px*400px,densityDpi=120-->QVGA:ldpi

分辨率為320px*533px,densityDpi=160 -->HVGA:mdpi

分辨率為480px*800px,densityDpi=240 -->WVGA:WVGA

4.深入了解代碼

盡管了解上面這些理論值,但是有時候發現設置了不同長度單位,可顯示出來的效果卻出人預想,我曾經就碰到過這種撓頭的問題,為解決這個問題,只有深入代碼,一探究竟了。

在深入代碼前我們首先要搞清楚一個問題,那就是代碼中所有長度值的單位都是px,手上沒有現成的例子就以現在我研究的/Launcher2/res/layout-land/workspace_screen.xml為例,看一個自定義屬性:

launcher:cellWidth="105pt"

該屬性自定義了一個桌面快捷圖標的寬度,若讀者自己測試,自己寫個測試view,設置屬性:

android:layout_width="800px"

是一樣的。

當view被創建的時候,xml中的屬性值存在參數AttributeSet attrs中:

  1. public CellLayout(Context context, AttributeSet attrs, int defStyle) 

繼續看該構造函數的實現代碼:

  1. public CellLayout(Context context, AttributeSet attrs, int defStyle) { 
  2. super(context, attrs, defStyle); 
  3. //獲取自定義屬性組CellLayout中的所有自定義屬性,關于自定義屬性,這里不作展開說明 
  4. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0); 
  5. //獲取屬性cellWidth的值,長度單位將轉換為px 
  6. mCellWidth = a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10); 
  7. 。。。 

實現長度單位換算的關鍵代碼就在a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10),直接深入到關鍵代碼:

  1. public int getDimensionPixelSize(int index, int defValue) 
  2. public static int complexToDimensionPixelSize(int data,DisplayMetrics metrics) 
  3. public static float applyDimension(int unit, float value,DisplayMetrics metrics){ 
  4. switch (unit) { 
  5. case COMPLEX_UNIT_PX: 
  6. return value; 
  7. case COMPLEX_UNIT_DIP: 
  8. return value * metrics.density; 
  9. case COMPLEX_UNIT_SP: 
  10. return value * metrics.scaledDensity; 
  11. case COMPLEX_UNIT_PT: 
  12. return value * metrics.xdpi * (1.0f/72); 
  13. case COMPLEX_UNIT_IN: 
  14. return value * metrics.xdpi; 
  15. case COMPLEX_UNIT_MM: 
  16. return value * metrics.xdpi * (1.0f/25.4f); 
  17. return 0

unit就是指單位類型,這個怎么來的我沒有,但我想它肯定是在解析xml是根據不同單位轉換的。

責任編輯:徐川 來源: OSChina
相關推薦

2011-06-01 10:58:54

Android Service

2011-12-15 10:43:20

JavaNIO

2022-05-11 09:03:05

CSS容器文本換行

2024-03-17 19:14:28

2010-05-31 17:45:50

MySQL行鎖

2016-01-12 18:04:55

Java異常研究

2017-06-06 11:29:23

Java異常研究與分析

2010-06-21 13:07:14

2010-11-18 17:24:27

Oracle旋轉ins

2018-12-24 15:00:58

混合云多云云采用

2010-11-23 16:35:59

MySQL刪除多表數據

2010-05-19 14:45:46

2009-12-08 18:45:17

PHP檢查函數可用

2021-05-25 09:00:00

Kubernetes容器集群

2010-11-26 11:57:35

MySQL結果字符串

2022-04-19 08:28:34

main函數

2009-10-20 10:17:50

綜合布線系統驗收

2010-08-23 17:47:33

DHCP服務器

2012-10-18 09:34:57

CSSdisplayDIV

2009-08-25 16:11:12

Repeater控件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区在线日韩在线深爱 | 中文字幕精品一区二区三区精品 | 国产精品美女一区二区 | 国产免费一区二区三区 | 无码一区二区三区视频 | 亚洲精品免费视频 | 日韩精品久久久久 | 国产乱码精品一区二三赶尸艳谈 | 羞羞视频网站免费观看 | 在线观看国产视频 | 欧美另类视频在线 | 欧美一区二区三区精品 | 久久久一区二区 | 欧美精品日韩精品国产精品 | 亚洲日本一区二区 | 中文字幕亚洲精品 | 日韩毛片在线免费观看 | 日韩三级电影一区二区 | 亚洲 欧美 综合 | 欧美不卡一区二区三区 | 国产精品久久久久久久久图文区 | 亚洲一二三区不卡 | 91久久国产综合久久 | 色橹橹欧美在线观看视频高清 | 毛片av免费看 | 久久久久久国产 | 一级国产精品一级国产精品片 | 在线观看黄色电影 | 日日久 | 国产精品久久久久久久一区探花 | 久草在线 | 精品久久影院 | 久久精品一区二区三区四区 | 91精品国产乱码久久久久久久 | 中文字幕亚洲区 | 美女久久久久久久久 | 久久国产精品视频 | 欧美综合视频在线 | 91免费视频观看 | www国产成人免费观看视频,深夜成人网 | 中文字幕第十五页 |