日韩无码专区无码一级三级片|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)銷(xiāo)解決方案
Android布局中長(zhǎng)度單位的深入研究

要想使自己的布局在不同設(shè)備達(dá)到精準(zhǔn)空置,理清理順Android布局長(zhǎng)度單位之間關(guān)系很有必要,否則你也許會(huì)經(jīng)常撓頭為什么顯示出來(lái)的布局不是自己定義的效果呢,有些東西,雖然基礎(chǔ),但是弄個(gè)透徹也需要花些功夫,廢話不多說(shuō),下面開(kāi)始。

成都創(chuàng)新互聯(lián)公司長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為赤峰企業(yè)提供專(zhuān)業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,赤峰網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

1.先了解一下Android有支持哪些長(zhǎng)度單位

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

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

屏幕實(shí)際分辨率為240px*400px時(shí),densitydpi=120

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

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

而dip與px之間的換算關(guān)系是:

pixs =dips * (densityDpi/160),也就是說(shuō)當(dāng)densityDpi=160時(shí),1dip=1px

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

pt: point,是一個(gè)標(biāo)準(zhǔn)的長(zhǎng)度單位,1pt=1/72英寸,用于印刷業(yè)(基本用不到)

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

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

in與px的換算關(guān)系:pixs = in*xdpi

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

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

2.系統(tǒng)獲取長(zhǎng)度單位

看了上面具體長(zhǎng)度單位的含義你會(huì)產(chǎn)生一個(gè)疑問(wèn),不同單位換算取決于系統(tǒng)的一些屬性,比如densityDpi的值,xdpi的值,那么系統(tǒng)這些值在哪里獲取了,直接看測(cè)試用例:

 
 
  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)之間的關(guān)系

系統(tǒng)drawable有hdpi,mdpi,ldpi三個(gè)文件夾下面存放不同尺寸的圖片,使用哪個(gè)文件下的文件,與系統(tǒng)densityDpi值是有關(guān)系的。

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

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

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

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

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

4.深入了解代碼

盡管了解上面這些理論值,但是有時(shí)候發(fā)現(xiàn)設(shè)置了不同長(zhǎng)度單位,可顯示出來(lái)的效果卻出人預(yù)想,我曾經(jīng)就碰到過(guò)這種撓頭的問(wèn)題,為解決這個(gè)問(wèn)題,只有深入代碼,一探究竟了。

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

launcher:cellWidth="105pt"

該屬性自定義了一個(gè)桌面快捷圖標(biāo)的寬度,若讀者自己測(cè)試,自己寫(xiě)個(gè)測(cè)試view,設(shè)置屬性:

android:layout_width="800px"

是一樣的。

當(dāng)view被創(chuàng)建的時(shí)候,xml中的屬性值存在參數(shù)AttributeSet attrs中:

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

繼續(xù)看該構(gòu)造函數(shù)的實(shí)現(xiàn)代碼:

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

實(shí)現(xiàn)長(zhǎng)度單位換算的關(guān)鍵代碼就在a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10),直接深入到關(guān)鍵代碼:

 
 
  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就是指單位類(lèi)型,這個(gè)怎么來(lái)的我沒(méi)有,但我想它肯定是在解析xml是根據(jù)不同單位轉(zhuǎn)換的。


名稱(chēng)欄目:Android布局中長(zhǎng)度單位的深入研究
轉(zhuǎn)載源于:http://m.5511xx.com/article/cdgioie.html