隨著支持Android系統(tǒng)的設(shè)備(手機(jī)、平板、電視、手表)的增多,設(shè)備碎片化、品牌碎片化、系統(tǒng)碎片化、傳感器碎片化和屏幕碎片化的程度也在不斷地加深。而我們今天要探討的,則是對(duì)我們開(kāi)發(fā)影響比較大的——屏幕的碎片化。
Android設(shè)備差異化非常大,分辨率不同、屏幕尺寸不同、屏幕長(zhǎng)寬比也不同。
分辨率方面,目前主流標(biāo)準(zhǔn)分辨率有720p、1080p、2k、4k等,根據(jù)移動(dòng)觀象臺(tái)數(shù)據(jù)顯示,2016年4季度,安卓設(shè)備前五名分辨率占比75%,前十名占比88%,但排名第100名的分辨率也占到0.01%,這一數(shù)據(jù)不一定精確,但反映了分辨率“千差萬(wàn)別,主流集中”的特點(diǎn),另外有部分手機(jī)內(nèi)置虛擬按鍵(如華為),會(huì)導(dǎo)致屏幕可用分辨率發(fā)生變化。
屏幕尺寸方面,可分為穿戴設(shè)備、手機(jī)、平板和電視等,穿戴設(shè)備和電視一般是針對(duì)特定硬件開(kāi)發(fā),我涉及的也不多,這里不討論,手機(jī)的特點(diǎn)是屏幕大小基本與手掌相當(dāng),目前一般集中在5-5.5寸,而平板則屏幕大小相差較大,一般7-11寸。
屏幕長(zhǎng)寬比不同,這個(gè)與分辨率的多樣性是相關(guān)的,有4:3,16:9等,不過(guò)這個(gè)差異一般不是太明顯,就拿電視來(lái)說(shuō),從以前的方形電視,到目前主流偏寬的電視,都是可以觀看的,可能稍有拉伸。
Android屏幕適配方式;
1 適配方式之 dp
分辨率:eg:480*800,1280*720。表示物理屏幕區(qū)域內(nèi)像素點(diǎn)的總和。(切記:跟屏幕適配沒(méi)有任何關(guān)系)
因?yàn)槲覀兗瓤梢园?/span> 1280*720 的分辨率做到 4.0 的手機(jī)上面。
我也可以把 1280*720 的分辨率做到 5.0 英寸的手機(jī)上面,如果分辨率相同,手機(jī)屏幕越小清晰。
px(pix):像素,就是屏幕中最小的一個(gè)顯示單元
dpi(像素密度):即每英寸屏幕所擁有的像素?cái)?shù),像素密度越大,顯示畫(huà)面細(xì)節(jié)就越豐富。
計(jì)算公式:像素密度=√{(長(zhǎng)度像素?cái)?shù)^2+寬度像素?cái)?shù)^2)}/ 屏幕尺寸
注:屏幕尺寸單位為英寸 例:分辨率為 1280*720 屏幕寬度為 6 英寸 計(jì)算所得像素密度約等于 245,屏幕尺寸指屏幕對(duì)角線的長(zhǎng)度。
Android 應(yīng)用在查找圖片資源時(shí)會(huì)根據(jù)其分辨率自動(dòng)從不同的文件目錄下查找(這本身就是 Android 系統(tǒng)的適配策略),如果在低分辨的文件目錄中比如 drawable-mdpi 中沒(méi)有圖片資源,其他目錄中都有,當(dāng)我們將該應(yīng)用部署到 mdpi 分辨率的手機(jī)上時(shí),那么該應(yīng)用會(huì)查找分辨率較高目錄下的資源文件,如果較高分辨率目錄下也沒(méi)有資源則只好找較低目錄中的資源了。
常見(jiàn)手機(jī)屏幕像素及對(duì)應(yīng)分別率級(jí)別:
ldpi 320*240
mdpi 480*320
hdpi 800*480
xhdpi 1280*720
xxhdpi 1920*1080
dp 和 px 之間的簡(jiǎn)單換算關(guān)系:
ldpi 的手機(jī) 1dp=0.75px
mdpi 的手機(jī) 1dp=1.0px
hdpi 的手機(jī) 1dp=1.5px
xhdpi 的手機(jī) 1dp=2.0px
xxhdpi 的手機(jī) 1dp=3.0px
2 適配方式之 dimens
跟 drawable 目錄類(lèi)似的,在 Android 工程的 res 目錄下有 values 目錄,這個(gè)是默認(rèn)的目錄,同時(shí)為了適配不同尺寸
手機(jī)我們可以創(chuàng)建一個(gè) values-1280x720 的文件夾,同時(shí)將 dimens.xml 文件拷貝到該目錄下。在 dimens.xml 中定義一個(gè)尺寸。在 values-1280x720 目錄中的 dimens.xml 中定義同樣的尺寸名稱(chēng),但是使用不同的尺寸。當(dāng)我們?cè)诓季治募惺褂瞄L(zhǎng)或者寬度單位時(shí),應(yīng)該使用@dimen/width 來(lái)靈活的定義寬度。
3,適配方式之 layout
跟 values 一樣,在 Android 工程目錄中 layout 目錄也支持類(lèi)似 values 目錄一樣的適配,在 layout 中我們可以針對(duì)不同手機(jī)的分辨率制定不同的布局,
4,適配方式之 java 代碼適配
就是獲取屏幕的寬度,根據(jù)你的圖片的寬高比,通過(guò)屏幕的寬度動(dòng)態(tài)的算出圖片的高度。通過(guò)Android相應(yīng)api獲取當(dāng)前手機(jī)的寬高像素值,按比例分配屏幕中控件的寬高以達(dá)到適配效果。
public class MainActivity extends Activity {
private static final String tag = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉 title
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//獲取 TextView 控件
TextView tv = (TextView) findViewById(R.id.tv);
//獲取封裝當(dāng)前手機(jī)屏幕信息對(duì)象,用于存放寬高值
DisplayMetrics metrics = new DisplayMetrics();
//給當(dāng)前 metrics 去設(shè)置當(dāng)前屏幕信息(寬(像素)高(像素))(//給當(dāng)前屏幕設(shè)置寬高)
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//獲取屏幕的高度和寬度
Constant.srceenHeight = metrics.heightPixels;
Constant.srceenWidth = metrics.widthPixels;
//日志輸出屏幕的高度和寬度
Log.i(tag, “Constant.srceenHeight = “+Constant.srceenHeight);
Log.i(tag, “Constant.srceenWidth = “+Constant.srceenWidth);
//寬高各 50%
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
//數(shù)學(xué)角度上 四舍五入
(int)(Constant.srceenWidth*0.5+0.5),
(int)(Constant.srceenHeight*0.5+0.5));
//給 tv 控件設(shè)置布局參數(shù)
tv.setLayoutParams(layoutParams);
}
}
其中 Constant 類(lèi)是一個(gè)常量類(lèi),很簡(jiǎn)單,只有兩個(gè)常量用來(lái)記錄屏幕的寬和高,其代碼清單如下:
public class Constant {
public static int srceenHeight;
public static int srceenWidth;
}
5, 適配方式之 weight 權(quán)重適配
在控件中使用屬性 android:layout_weight=”1”可以起到適配效果,但是該屬性的使用有如下規(guī)則:只能用在線性控件中,比如 LinearLayout。豎直方向上使用權(quán)重的控件高度必須為 0dp(Google 官方的推薦用法)水平方向上使用權(quán)重的控件寬度必須為 0dp(Google 官方的推薦用法)。
手機(jī)自適應(yīng)主要分為兩種情況:橫屏和豎屏的切換,以及分辨率大小的不同。
橫屏和豎屏的切換:
1、Android 應(yīng)用程序支持橫豎屏幕的切換,Android 中每次屏幕的切換動(dòng)會(huì)重啟 Activity,所以應(yīng)該在 Activity銷(xiāo)毀(執(zhí)行 onPause()方法和 onDestroy()方法)前保存當(dāng)前活動(dòng)的狀態(tài);在 Activity 再次創(chuàng)建的時(shí)候載入配置,那樣,進(jìn)行中的游戲就不會(huì)自動(dòng)重啟了!有的程序適合從豎屏切換到橫屏,或者反過(guò)來(lái),這個(gè)時(shí)候怎么辦呢?可以在配置 Activity 的地方進(jìn)行如下的配置 android:screenOrientation=”portrait”(landscape 是橫向,portrait 是縱向)。這樣就可以保證是豎屏總是豎屏了。
2、而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置 Activity 的時(shí)候進(jìn)行如下的配置:android:configChanges=”keyboardHidden|orientation” , 另 外 需 要 重 寫(xiě) Activity 的onConfigurationChanged 方法。實(shí)現(xiàn)方式如下:
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
LANDSCAPE){
//TODO
}else
文章內(nèi)容來(lái)源于網(wǎng)絡(luò),侵刪