Android 屏幕適配

android屏幕適配的整體思路

  • 開發前,選取一款主流屏幕進行開發,比如現在的1280*720;
  • 開發過程中,遵循一些原則:不用AbsoluteLayout(絕對佈局), 多用相對佈局&線性佈局(權重), 要用dp,不用px
    dp和px的關係:dp = px/設備密度
    320*480的設備密度爲1.0, 480*800的設備密度爲1.5, 1280*720的設備密度爲2.0。
    // 獲取設備密度
    float density = getResources().getDisplayMetrics().density;
    System.out.println("設備密度:" + density);
  • 開發後期,再在不同的屏幕上測試(480*800 、1920*1080)。

具體主要有如下幾種適配

  1. 圖片適配(不是很常用)
    • 在不同的drawable文件夾下,放置幾套不同大小的圖片。
    • 缺點:會導致apk體積過大。
    • 如果圖片非常重要,比如app的logo,這時可以在不同的drawable下放置幾張不同大小的logo圖片
  2. 佈局適配(不是很常用)
    • 在res目錄下,創建不同佈局的layout文件夾。比如要適配480*800的屏幕,就建立layout-800x480的文件夾
    • 缺點:不利於後期維護,一旦佈局需要改動一丁點,將是一個浩大的工程。
  3. 尺寸適配(很常用)
    • 在res目錄下,創建不同的values文件夾。比如要適配1280*720的屏幕,就建立values-1280x720文件夾,在該文件夾下,創建dimens.xml文件,在文件裏面設置尺寸。
  4. 權重適配(很常用)
    • android:weightSum=”3” android:weight=”1”
    • 在要平均分配屏幕寬度或高度時常用權重,比如一般app的底部標籤的佈局。
  5. 代碼適配
    • int width = getWindowManager().getDefaultDisplay().getWidth();
      int height = getWindowManager().getDefaultDisplay().getHeight();
    • 拿到屏幕的寬高,就可以進行相關適配了。

屏幕適配的工具類

public class DisplayUtil {  
    /** 
     * 將px值轉換爲dip或dp值,保證尺寸大小不變 
     *  
     * @param pxValue 
     * @param scale 
     *            (DisplayMetrics類中屬性density) 
     * @return 
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  

    /** 
     * 將dip或dp值轉換爲px值,保證尺寸大小不變 
     *  
     * @param dipValue 
     * @param scale 
     *            (DisplayMetrics類中屬性density) 
     * @return 
     */  
    public static int dip2px(Context context, float dipValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dipValue * scale + 0.5f);  
    }  

    /** 
     * 將px值轉換爲sp值,保證文字大小不變 
     *  
     * @param pxValue 
     * @param fontScale 
     *            (DisplayMetrics類中屬性scaledDensity) 
     * @return 
     */  
    public static int px2sp(Context context, float pxValue) {  
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;  
        return (int) (pxValue / fontScale + 0.5f);  
    }  

    /** 
     * 將sp值轉換爲px值,保證文字大小不變 
     *  
     * @param spValue 
     * @param fontScale 
     *            (DisplayMetrics類中屬性scaledDensity) 
     * @return 
     */  
    public static int sp2px(Context context, float spValue) {  
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;  
        return (int) (spValue * fontScale + 0.5f);  
    }  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章