昨天就沒有更新文章,在不更新就說不過去了,今天是清明節的第一天,我沒有出去玩,不過在我心里是這么認為的,心中有風景,到哪都是旅游。不好意思,扯遠啦,收回來。
做過Android項目的人應該都知道,Android的屏幕適配問題是比較煩人的,因為Android不像IOS那樣,只要那幾個分辨率,反觀Android就不同,Android手機的屏幕分辨率類別太多。雖然本人也沒有做過幾個Android項目,但是今天還是想談談Anroid的屏幕適配,當做是一個對自己學習的總結吧,如果有沒有涉及的地方,還請大家多多指教。
本人把Android的屏幕適配問題分為5個模塊,分別是圖片適配、布局適配、尺寸適配、權重適配、代碼適配。
前言
開發過Android的同學應該都知道,在Android的res目錄下有這樣幾個目錄,分別是drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xdpi、drawable-xxhdpi。
- drawable-hdpi:高分辨率
- drawable-ldpi:低分辨率
- drawable-mdpi:中等分辨率
- drawable-xdpi:更高分辨率
- drawable-xxdpi:最高分辨率
圖片適配
在剛開始學習Android的時候,只知道把圖片直接拷貝都drawable-hdpi目錄下,一開始的時候只知道這幾個目錄是用來做屏幕適配的,現在終于了解到了,現在我來模擬一個場景讓大家了解什么是圖片適配。但是這種適配我們一般用的比較少。
假設一個場景,如果一張圖片顯示在低分辨率的手機上剛好,但是如果它顯示到特別高的分辨率手機上的時候,你會感覺它比較小,這個時候,我們就可以讓我們的美工美眉切幾張不同大小的圖片,并它他們放到相對應的目錄下,當系統在加載的時候,會根據手機的分辨率對應的目錄下查找需要的圖片。
布局適配
首先說一下,這個也不是很常用。假設我們要專門適配480x800的屏幕,這里的數值指的都是像素,可以新建一個在src/目錄下新建一個layout-800x480 目錄,然后把響應的布局拷到這個目錄下,即可,說一下一個應用場景。
假設我們在320x480的屏幕上顯示一個TextView,但是我們卻想讓屏幕為480x800的手機在相同的位置上顯示一個Button,我們就可以這樣弄。
尺寸適配
首先說一個,這個非常常用,首先我們來了解一下dp和px(像素)的關系。dp = px/設備密度 ,那么我們在代碼中如何獲取設備的密度。使用如下代碼即可
float density = getResources().getDisplayMetrics().density;
System.out.println("設備密度:" + density);
那么接下來我們說說設備密度值是以什么為參考的,答案是一320x480的設備密度值為1,那么320x240就是0.75,480x800是1.5,1280x720是2。
那么我們要怎么適配呢?我們也模擬一個場景。
假設我們要在屏幕上顯示一個寬度為屏幕寬度一般的TextView,怎么看出來它占一半呢?我們可以給這個TextView加一個背景。如果是在320x480的手機上,我們寫的160dp和160px效果是相同的,但是其他分辨率的手機,我們絕對不能使用px。假設我們寫對了,我們寫的是160dp,那么在480x800下效果也是正常的,我來舉一個不正常的例子,我的手機的魅族的手機,屏幕分辨率是1800X1080,但是我的手機的設備密度值為2.5。如果要達到相同的效果,我寫的應該是216dp。怎么算出來的呢?1080是我手機的寬度,這個是像素哦。那么根據公式,dp = 1080 / 2 /2.5 ==>dp = 216dp。如果我們使用的還是160dp,那么我的手機就顯示一小半,但是如果改成了216dp,那么在低分辨率的手機上又顯示錯誤了,這個時候我們應該怎么辦呢?我們可以這樣做,在dimens.xml中定義一個<dimen name="textViewWidth">160dp</dimen>。在/res目錄下,新建一個values-1800x1080目錄,把values目錄下的dimens.xml復制過去,然后我們把它改成216dp,這樣就完成了適配,但是布局文件中我們應該要使用textViewWidth這個尺寸。
權重適配
android:weightSum="3"
這句代碼可以定義這個控件的權重值,那么在子控件中只能分配權重為3。這樣我們就可以實現兩個TextView各占1/3的效果了。
代碼適配
通常我們在寫代碼的時候,不能把尺寸的像素尺寸寫死,因為我們要考慮到一個屏幕適配的問題,模擬一個場景。
假設我們在項目使用到了SlidingMenu的開源側滑菜單,我們要給側滑菜單的寬度設置為屏幕的1/3,其中有一個方法是設置菜單的寬度,在這里我們就不能給寫死了,因為我們寫死的值是像素值,它不是dp值,那么我們要做的事就是根據屏幕分辨率來獲取到屏幕的1/3是多少個dp值,然后根據dp值和設備密度值來計算像素值,這樣才可以設置像素值。下面是一個工具類,用于dp和px的轉換。
public class DensityUtil {
/**
* 根據手機的分辨率從 dip 的單位 轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據手機的分辨率從 px(像素) 的單位 轉成為 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}