Android 系统当中各种尺寸单位的定义及使用
生活随笔
收集整理的這篇文章主要介紹了
Android 系统当中各种尺寸单位的定义及使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一,Android 各種標尺單位的含義:
px:表示屏幕實際的象素。例如,320*480的屏幕在橫向有320個象素,在縱向有480個象素。pt:表示一個點,是屏幕的物理尺寸。大小為1英寸的1/72。
in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如,形容手機屏幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個單位。這些尺寸是屏幕的對角線長度。如果手機的屏幕是3.2英寸,表示手機的屏幕(可視區域)對角線長度是3.2*2.54 = 8.128厘米。讀者可以去量一量自己的手機屏幕,看和實際的尺寸是否一致。
mm:表示毫米,是屏幕的物理尺寸。
常見的有 px(pixel) 與 pt(point) 兩種。
二,Android 中dp與sp標尺單位的由來及計算方法:
由于Google對Android的開放政策,使得所有廠商都可以加入到智能手機的研發中來。于是乎,Android手機一時間百花齊放,出現了各種不同的手機樣式。240*320 320*240 320*480 480*800 480*854 640*960 720*1280,……
屏幕物理尺寸3.2、3.5、3.75、4.0、4.3、5.0、7、9.3、10.1
為了更好的描述這種多樣化引發的問題,我們需要引入一個新的概念density,也就是密度。它指的是在一定尺寸的物理屏幕上顯示像素的數量,一般使用dpi(dots per inch,每英寸像素數)作為單位。比如一臺分辨率為240x320,屏幕物理尺寸為1.5英寸x2英寸的手機,他的密度可以用分辨率/尺寸,240/1.5或者320/2,密度為160dpi。對于用戶來說,密度越大的屏幕顯示效果越精細,因為每英寸顯示的像素數量更多。
如果是要使用px和pt給程序貼圖,假設生成了一條240px的直線,在240*320的屏幕上剛好可以鋪滿,而放到480x800的分辨率下才剛剛到一半的位置。
如果要解決這樣的問題,那么程序在實現的時候就必須為每個分辨率都寫一個配置,否則就會出現圖形在低密度的屏幕上顯示的更大,而在高密度的屏幕上顯示的更小。最麻煩的事情在于,一旦出現新的分辨率,所有程序都沒辦法直接運行了。這明顯不符合手機快速發展的客觀規律。
為了解決這個問題,Google為Android引入了一套新的單位dp和sp。
首先登場的是dp,Density Independent Pixel,可以翻譯為密度無關像素。和px相比,dp在不同密度的屏幕中實際顯示比例將保持一致。根據規定,一個dp相當于160dpi屏幕中的一個px。在320dpi的屏幕中,一個dp相當于2個px。通過這樣的成比例放縮,Android解決了需要多個不同屏幕中的大小顯示問題。
具體而言,當屏幕的的分辨率為320x480時,無論實際的物理尺寸大小,密度都會被設置為160dpi,也就意味著這個設備上,一行最多可以放置320dp,而對于480x800的設備,只需屏幕尺寸在3寸到4.3寸之間,密度都會被設置為240dpi,一行同樣可以放置320dp。
因此在開發中,用dp作為單位,只需要設置一次,就可以適配到多個屏幕上。
同樣,sp,scaled pixels,這個單位也采用了和dp同樣的設計理念,將需要獨立設置的pt轉化為可以自動適配的sp,從而解決了文字的優化顯示。
三,具體的 dpi(dot per inch每英寸像素數) 計算方法:
譬如1280x720物理分辨率,5英寸大小的屏幕,其dpi 的計算方法是:sqrt(1280*1280+720*720)/5 = 293.72 dpi四,px 與 dp 的轉換方法:
譬如1280x720物理分辨率,5英寸大小的屏幕上,<dimen name="indicator_bar_width_large">54dp</dimen>這個高度如何轉換成 px 呢,計算方法是:54dp*293.72/160+0.5f = 99.6305px,約為 100px。 那么我們就可以給這個長度去讓UI工程師提供切圖了。
import android.content.Context;??
public class DensityUtil {??
??
??? /**?
???? * 根據手機的分辨率從 dp 的單位 轉成為 px(像素)?
???? */??
??? public static int dip2px(Context context, float dpValue) {??
??????? final float scale = context.getResources().getDisplayMetrics().density;??
??????? return (int) (dpValue * scale + 0.5f);??
??? }??
??
??? /**?
???? * 根據手機的分辨率從 px(像素) 的單位 轉成為 dp?
???? */??
??? public static int px2dip(Context context, float pxValue) {??
??????? final float scale = context.getResources().getDisplayMetrics().density;??
??????? return (int) (pxValue / scale + 0.5f);??
??? }??
}?
五,屏幕像素密度 dpi 分類:
譬如1280x720物理分辨率,5英寸大小的屏幕 需要對應哪一種界面布局或者圖片資源呢?圖片資源有 drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi,drawable-xxxhdpi(2K屏)等等
界面布局:layout-small,layout-normal,layout-mdpi,layout-hdpi,layout-xhdpi, 甚至還可以有 layout-480x854 這種特殊尺寸的布局
ldpi:low-dpi 低像素密度
mdpi:middle-dpi 中像素密度
hdpi:high-dpi 高像素密度
xhpi:extreame high-dpi 超高像素密度
可以查看下圖:
那么根據上面算出來的 293.72dpi 可以算為 xhdpi 超高像素密度了。
六,編程建議(如何做到自適應屏幕大小):
1, 需要根據物理尺寸的大小準備多套布局,layout(放一些通用布局xml文件,比如界面中頂部和底部的布局,不會隨著屏幕大小變化,類似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-hdpi(4英寸-7英寸之間),layout-xhdpi(7-10英寸之間)
2, 需要根據dpi值準備5套圖片資源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi
? Android有個自動匹配機制去選擇對應的布局和圖片資源
????
3, 在XML布局,使用wrap_content和fill_parent來填充整個父窗口;
4, 使用FrameLayout的,而不是AbsoluteLayout,減少界面布局對屏幕大小的依賴;
5, 使用dp 來代替 px 作為圖片長度單位;文字用 sp 代替 px 來作為字號大小;
6, 根據density 和 resolution 為不同的設備準備合適的圖片資源,見上面第五條。
參考文獻:
【1】dp和px,那些不得不吐槽的故事——Android平臺圖片文字元素單位淺析 ?http://blog.sina.com.cn/s/blog_6499f8f101014ipq.html 【2】Android手機分辨率基礎知識(DPI,DIP計算)?http://blog.csdn.net/moruite/article/details/6028547 【3】Android中dp和px之間進行轉換??http://blog.csdn.net/arui319/article/details/6777133 【4】Android中的長度單位詳解(dp、sp、px、in、pt、mm)http://blog.csdn.net/nokiaguy/article/details/5509638 【5】Android屏幕密度(Density)和分辨率的解釋?http://www.apkbus.com/android-15796-1-1.html總結
以上是生活随笔為你收集整理的Android 系统当中各种尺寸单位的定义及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 填满手机磁盘空间方法
- 下一篇: Android系统开机启动流程及init