1. 程式人生 > >android 通用螢幕適配小結

android 通用螢幕適配小結

1.目錄對應裝置關係

ldpi: 螢幕密度為120的手機裝置

mdpi: 螢幕密度為160的手機裝置(此為baseline,其他均以此為基準,在此裝置上,1dp = 1px)

hdpi: 螢幕密度為240的手機裝置

xhdpi: 螢幕密度為320的手機裝置

xxhdpi:螢幕密度為480的手機裝置

android預設的low=120 ;Medium =160; High = 240

 

2. 程式啟動圖示:

LDPI (Low Density Screen,120 DPI),其圖示大小為 36 x 36 px。

MDPI (Medium Density Screen, 160 DPI),其圖示大小為 48 x 48 px。

HDPI (High Density Screen, 240 DPI),其圖示大小為 72 x 72 px。

xhdpi (Extra-high density screen, 320 DPI),其圖示大小為 96 x 96 px。

xxhdpi(xx-high density screen, 480 DPI),其圖示大小為144 x 144 px。

 

3.桌面ICON的尺寸:5個尺寸的ICON,分別對應資源目錄res下以drawable_開頭的幾個資料夾內。

36*36 ——->drawable_ldpi目錄下
48*48 ——->drawable_mdpi目錄下


72*72 ——->drawable_hdpi目錄下
96*96 ——->drawable_xhdpi目錄下
144*144——>drawable_xxhdpi目錄下

 

4.圖片尺寸:和ICON對應,分別對應資源目錄res下以drawable_開頭的幾個資料夾內。

320*240 ——–>drawable_ldpi目錄下
480*320 ——–>drawable_mdpi目錄下
800*480 ——–>drawable_hdpi目錄下
1280*720 ——->drawable_xhdpi目錄下
1920*1080 ——>drawable_xxhdpi目錄下

 

5.注意

  • 據px = dip * density / 160,則當螢幕密度為160時,px = dip

  • TextView 的字號最好使用 sp 做單位,而且檢視TextView的原始碼可知Android預設使用sp作為字號單位。將dip作為其他元素的單位。

  • 圖片放在drawable中,等同於放在drawable-mdpi中,原因為:drawable目錄不具有螢幕密度特性,所以採用基準值,即mdpi

  • 圖片放在某個特定drawable中,比如drawable-hdpi,如果裝置的螢幕密度高於當前drawable目錄所代表的密度,則圖片會被放大,否則會被縮小,放大或縮小比例 = 裝置螢幕密度 / drawable目錄所代表的螢幕密度

  • 為了更全面的適配所有裝置,我們應該提供一套針對主流螢幕密度的圖片(目前為hdpi或xhdpi),其他密度通過系統自動縮放得到圖片

  • import android.content.Context;
    
    public class DimenUtils {
    
        public static int spTopx(Context context, float spValue) {
            float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
            return (int) (spValue * fontScale + 0.5f);
        }
    
        public static int pxTosp(Context context, float pxValue) {
            float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
            return (int) (pxValue / fontScale + 0.5f);
        }
    
        public static int dipTopx(Context context, int dipValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dipValue * scale + 0.5f);
        }
    
        public static int pxTodip(Context context, float pxValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (pxValue / scale + 0.5f);
        }
    }