長期以來,適配都是Android開發人員的通病,Android的開源導致了Android的多樣化,各大手機廠商對Android系統進行了深度定製,根據自己需求,開發出各種各樣尺寸的手機。這些各種各樣尺寸的手機,無疑給我們這些開發人員添了很多麻煩,到底怎樣才能做到更好的適配呢,以下是本人適配總結,如果有欠缺或不對的地方,還望指出與海涵。
首先先知道基礎概念
屏幕大小(screen size):屏幕的實際大小,用屏幕對角線長度來衡量。ndroid把屏幕分爲以下4種:small(小 屏),normal(正常屏),large(大屏),extra large(特大屏)。
屏幕密度(Screen Density):一塊實際的屏幕區域有多少個像素,一般用dpi衡量(每英寸有多少個點)。相比 起medium、high屏幕密度的設備,在一塊確定大小的屏幕區域l密度爲low的屏 幕擁有的像素更少。
方向(orientation):屏幕方向分爲landscape(橫屏)和portrait(豎屏)。
分辨率(Resolution) : 屏幕上的總實際像素數。對屏幕進行適配時,一般不關注它的分辨率,只關注它的屏 幕大小和密度。
與密度無關的像素(Density-independent pixel,dp或dip): 爲了保證你的UI適合不同的屏幕密度,建議你採 用dp來定義程序UI。
計算方法:
public static int dip2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }
android把屏幕密度分爲4種:low,medium,high,extra high。各dpi代表的密度:ldpi:120 mdpi:160 hdpi:240 xdpi:320 xxdpi:480 你可以根據下面的方法獲取你手機的密度
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 屏幕寬度(像素) int height = metric.heightPixels; // 屏幕高度(像素) float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5) int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240) System.out.println("width:"+width+"\nheight:"+height+"\n屏幕密度:"+density+"\n屏幕密度DPI:"+densityDpi);
2. 具體的適配方法
首先需要在Manifest裏面需要設置支持屏幕類型
<supports-screens android:smallScreens="true" //是否支持小屏 android:normalScreens="true" //是否支持中屏 android:largeScreens="true" //是否支持大屏 android:xlargeScreens="true" //是否支持超大屏 android:anyDensity="true" //是否支持多種不同密度的屏幕 ”/>
1、對應用圖標的適配:
hdpi 72*72 | ldpi 36*36 | mdpi 48*48 | xdpi 96*96 | xxdpi 120*120
2、對不同屏幕進行適配
在res目錄下面創建不同的layout文件夾,例如:layout-large 也可以根據分辨率創建如layout-480x800 ,然後放響應的xml文件即可
可以對不同密度的手機提供不同的圖片(建議使用)因爲很多時候如果你做的應用,圖片很多的話,一套圖是肯定滿足不了的,因爲可能低密度顯示沒問題,但是較高密度手機就會顯示很小
另外界面適配很大一部分也取決於你的佈局,要學會靈活的使用四大布局 儘量多的使用wrap_content match_parent dp ,多分析一下界面的設計, 有時候能起到事半功倍的作用。