天天看點

安卓螢幕适配

螢幕參數 幾個概念: 1, Screen size 螢幕的尺寸,(螢幕實際大小)即對角線長度(機關inch-英寸)         四種螢幕尺寸分類:: small, normal, large, and xlarge 2, Screen density螢幕密度,即機關長度像素點數(pots/inches), 一塊實際的螢幕區域有多少個像素,一般用dpi衡量(每英寸有多少個點)。 相比起medium、high螢幕密度的裝置,在一塊确定大小的螢幕區域l密度為low的螢幕擁有的像素更少。android把螢幕密度分為4種:low,medium,high,extra high。即ldpi,mdpi,hdpi,xxhdpi 先了解一下螢幕的級别:

螢幕級别: 注意螢幕級别是按照密度分級,和像素沒有關系。 如果非要讓密度和像素扯上關系,則需要一個參照系,android使用mdpi級别作為标準參照螢幕,也就是說在320*480分辨率的手機上一個密度可以容納一個像素。然後其他密度級别則在此基礎上進行對比。 理想情況下,480*800的螢幕(hdpi)一個密度可以容納1.5個像素。 實體大小: 機關是英寸而不是像素,也就說一個英寸在任何分辨率下顯示的大小都是一樣的,但是像素在密度不同的手機裡面顯示的實際的大小是不一樣的(這就是為什麼android手機需要适配的原因)。 重點:     假設1像素在160密度下顯示1英寸,則1像素在240密度基礎上顯示大約0.67英寸,在320密度下顯示0.5英寸。于是就出現一種情況,在電腦上的一個像素,在不同的手機上看實際的大小不一樣。那麼怎麼讓“設計效果”在不同的手機上看起來顯示的區域一樣呢?     還是假設一個像素在160密度下的顯示在一個密度内,也假設就是一英寸。那麼需要幾個像素才能在240密度級别下顯示在一英寸範圍内呢?答案是1.5個像素(根據上圖的比率換算)。 3,方向(orientation) -  螢幕方向分為landscape(橫屏)和portrait(豎屏)。 4, Resolution 分辨率,即螢幕的總像素點數(width * height) 對螢幕進行适配時,一般不關注它的分辨率,隻關注它的螢幕大小和密度。         分辨率是指顯示器所能顯示的像素的多少, 一塊螢幕橫向有多少個點,豎向有多少個點,相乘之後的數值就是這塊螢幕的分辨率(但是為了友善表示螢幕的大小,通常用橫向像素×豎向像素的方式來表示 4, Density-independent pixel (dp)獨立像素密度, 與密度無關的像素(Density-independent pixel,dp或dip)   為了保證你的UI适合不同的螢幕密度,建議你采用dp來定義程式UI。 标準是160dip.即1dp對應1個pixel,計算公式如:px = dp * (dpi / 160),螢幕密度越大,1dp對應 的像素點越多。

2怎樣适配多種螢幕  Android尋找最佳資源原理 1, 排除與裝置設定不符合的資源 2, 根據限定詞(qualifier)的優先級,按照順序查找 3, 在限定詞下,是否存在資源路徑 4, 排除不包含在限定詞中的資源路徑 5,  繼續執行不同的限定詞查找,直到找到相應的資源

總結一下: 第一:android:anyDensity="true",系統會依據螢幕密度,自動去找對應的檔案夾 第二:android:anyDensity="false", (1)如果drawable-hdpi,drawable-mdpi,drawable-ldpi三個檔案夾中有同一張圖檔資源的不同密度表示,那麼系統會去加載 drawable_mdpi檔案夾中的資源 (2)如果drawable-hpdi中有高密度圖檔,其它兩個檔案夾中沒有對應圖檔資源,那麼系統會去加載drawable-hdpi中的資源。 (3)如果drawable-hdpi,drawable-mdpi中有圖檔資源,drawable-ldpi中沒有對應的圖檔資源,那麼系統會加載drawable-mdpi檔案夾中的資源  drawable-hdpi 該圖檔即适用于橫屏,也适用于豎屏 drawable-land-hdpi,當螢幕為橫屏,且為高密度時,加載此檔案夾中的資源 drawable-port-hdpi,當螢幕為豎屏,且為高密度時,加載此檔案夾中的資源 

自适應螢幕大小 1.在manifest裡定義你的程式支援的螢幕類型,相應代碼如下:(預設已經全部支援) <supports-screens android:resizeable=["true"| "false"] android:smallScreens=["true" | "false"]   //是否支援小屏 android:normalScreens=["true" | "false"]  //是否支援中屏 android:largeScreens=["true" | "false"]   //是否支援大屏 android:xlargeScreens=["true" | "false"]  //是否支援超大屏 android:anyDensity=["true" | "false"]    //是否支援多種不同密度的螢幕 android:requiresSmallestWidthDp=”integer” android:compatibleWidthLimitDp=”integer” android:largestWidthLimitDp=”integer”/> 2,對不同大小的螢幕提供不同的layout。

比如,如果需要對大小為large的螢幕提供支援,需要在res目錄下建立一個檔案夾layout-large/并提供layout。當然,也可以在res目錄下建立layout-port和layout-land兩個目錄,裡面分别放置豎屏和橫屏兩種布局檔案,以适應對橫屏豎屏自動切換。 3,對不同密度的螢幕提供不同的圖檔。在drawable中,以mdpi為标準(即160dpi)。比例保持為3:4:5:6

應盡量使用點9格式的圖檔,如需對密度為low的螢幕提供合适的圖檔,需建立檔案夾drawable-ldpi/,并放入合适大小的圖檔。相應的,medium對應drawable-mdpi /,high對應drawable-hdpi/,extra high對應drawable-xhdpi/。 圖檔大小的确定:low:medium:high:extra high比例為3:4:6:8。舉例來說,對于中等密度(medium)的螢幕你的圖檔像素大小為48×48,那麼低密度(low)螢幕的圖檔大小應為36×36,高(high)的為72×72,extra high為96×96

多螢幕适配的4條黃金原則 a.在layout檔案中設定控件尺寸時應采用wrap_content,match_parent和dp。能夠使用權重的地方盡量使用權重(android:layout_weight),如果是純色背景,盡量使用android的shape 自定義。        具體來說,設定view的屬性android:layout_width和android:layout_height的值時,wrap_content,match_parent或dp比pix更好。相應地,為了使文字大小更好的适應螢幕應該使用sp來定義文字大小。

b.在程式的代碼中不要出現具體的像素值。 為了使代碼簡單,android内部使用pix為機關表示控件的尺寸,但這是基于目前螢幕基礎上的。為了适應多種螢幕,android建議開發者不要使用具體的像素來表示控件尺寸。

c.不要使用AbsoluteLayout(android1.5已廢棄) 。相應地,應使用RelativeLayout。

d.對不同的螢幕提供合适大小的圖檔

  擷取螢幕的大小可以有兩種方法: // 方法一: WindowManager manager = getWindowManager(); int width = manager.getDefaultDisplay().getWidth(); int height = manager.getDefaultDisplay().getHeight(); // 方法二: DisplayMetrics dMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dMetrics); int screenWidth = dMetrics.widthPixels; int screenHeight = dMetrics.heightPixels; 

兩種擷取螢幕分辨率資訊的方法: DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //這裡得到的像素值是裝置獨立像素dp

在代碼中擷取螢幕像素、螢幕密度  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) 

關于切圖: 關于切圖有幾個建議: 第一,長寬最好是3的倍數(根據android的推薦logo圖示的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公約數)。 第二,長寬最好是偶數。因為奇數在進行等比壓縮的時候可能有問題。 第三,根據上面兩條,如果長寬是6的倍數最理想。 第四,如果可以拉伸而不改變設計意圖的情況下,比如純色背景,則使用android的9path工具制作成.9的圖檔。

.9圖檔制作 在SDK裡的tools檔案夾裡有一個工具名字為draw9patch 原理: 解決圖檔失真。*.9.PNG就标準的PNG格式,隻是在最外面一 圈額外增加1px的邊框,這個1px的邊框就是用來定義圖檔中可擴充的和靜态不變的區域。特别說明, left(左)和top(上)邊框中交叉部分是可拉伸 部分,未選中部分是靜态區域部分。right和bottom(下和右)邊框中交叉部分則是内容部分。w 使用.9圖制作工具: 圖檔周圍出現了一像素的空隙,這個空隙就是給.9圖檔劃線用的。 在圖檔的上下左右分别劃線 其中,上方和左方的線是控制圖檔的可拉伸區域的,也就是說,上方的線控制圖檔中“信”字橫向可拉伸,左側的線控制縱向可拉伸,下方的線和右側的線控制圖檔的文本區域,也就是說,如果圖檔上有text,就會把位置控制在下方和右側的線圍城的區域裡。 如果想删除劃線,按住shift + 滑鼠左鍵,删除劃線。