安卓螢幕適配的方案

lixuce1234發表於2017-03-25

首先在開發者我們要養成一個良好的開發習慣,遵循一些好的螢幕適配原則:

開發前部分階段:比如儘量不用AbsoluteLayout(絕對佈局),多用線性佈局與相對佈局,設定寬高邊距等尺寸用dp(dip),不要用px。開發除錯選擇主流螢幕(1280*720)

開發後階段:在不同解析度手機(主流的手機解析度和當前市場主流手機)上測試,沒有大問題(不影響使用,比如不同解析度相差一兩個畫素這樣,當然,如果公司要求較
  高就必須處理了)就可以釋出上線使用。

出現問題解決方法:

1、圖片適配

該方法不常用,當圖片在不同螢幕手機上出現偏差、失偵等情況,很簡單,讓UI給你多切幾套圖,放在res目錄下的drawable-hdpi、drawable-mdpi、drawable-
xhdpi、drawable-xxhdpi、drawable-xxxhdpi,這幾個目錄分別對應不同的螢幕,當不同螢幕啟動App時候會優先去訪問其對應的目錄下的圖片
資源,如果對應下面沒有才回去訪問其他的目錄。

2、佈局適配

該方法也不常用,其原理和圖片適配差不多,就是當不同螢幕上同一個佈局檔案不能滿足需求,比如大螢幕需要做特殊顯示這種,此時就在res目錄下新建一個資料夾
layout-800x480(適配480*800的螢幕,其他螢幕同樣方法新建即可),然後在裡面去對進行指定的設定佈局檔案了。

3、尺寸適配

這裡先介紹一個概率:裝置密度(dp和px的轉換關係,dp=px/裝置密度);320*240(0.75), 480*320(1),480*800(1.5),1280*720(2)這是主流幾大螢幕對應的裝置密
度。

一般在開發者,美工UI給我們的都是PX,我們在設定的時候就不能還自己把PX快取DP這麼簡單了,比如說,美工在1280*720上面切了一套圖,給出的某個控制元件寬100px,那麼此時我們在佈局檔案設定就應該設定為50dp(100/裝置密度);在一些需求中,不同螢幕需要設定不同的尺寸,此時可以新建一個values-(解析度)這樣的目錄,在其下面有一個dimens檔案(在原values下的dimens也要設定),在裡面進行尺寸設定然後再佈局裡面呼叫即可,同樣的道理,手機訪問App當呼叫values裡面的檔案時會優先調優和自己對應的檔案。

還有一點就是我們在程式碼中設定尺寸適合Java程式碼預設為px,我們需要用一個工具類進行轉換

dp與px直接轉換的工具類:


public class ScreenSizeAdapter {  
  
    /**  
     * dip轉為 px  
     */  
    public static int dip2px(Context context, float dipValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dipValue * scale + 0.5f);  
    }  
  
    /**  
     * px 轉為 dip  
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  
}  


4、權重適配

線性佈局才能夠設定權重。在LinearLayout屬性設定裡面可以設定總權重Android:weightSum;然後在裡面的空間去分配權重,這樣不管在什麼手機,都是按照權重比例來進行顯示的。

5、程式碼適配

程式碼適配類似於權重適配,權重適配可以用程式碼適配來實習,但是程式碼適配就不一定能夠用權重適配來實現,比如相對佈局不能用權重,就可以程式碼來控制。實現原理是:計算螢幕寬高,動態的來設定空間寬高。一般根據比例去計算,比如側滑選單和主介面分別的比例,此時就可以這樣動態去計算

DisplayMetrics dm = new DisplayMetrics();  
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);  
int whdth = dm.widthPixels;//獲取螢幕寬度  
int height = dm.heightPixels;//獲取螢幕高度  

螢幕適配要根據不同的需求,不同的問題進行選擇不同的解決方法

相關文章