【全國(guó)】 集團(tuán)簡(jiǎn)介 關(guān)注我們
幫學(xué)院 商標(biāo)分類表-2024尼斯分類 知識(shí)產(chǎn)權(quán)交易

快幫集團(tuán)

Android屏幕適配方式

2019-04-13

隨著支持Android系統(tǒng)的設(shè)備(手機(jī)、平板、電視、手表)的增多,設(shè)備碎片化、品牌碎片化、系統(tǒng)碎片化、傳感器碎片化和屏幕碎片化的程度也在不斷地加深。而我們今天要探討的,則是對(duì)我們開發(fā)影響比較大的——屏幕的碎片化。


Android設(shè)備差異化非常大,分辨率不同、屏幕尺寸不同、屏幕長(zhǎng)寬比也不同。


分辨率方面,目前主流標(biāo)準(zhǔn)分辨率有720p1080p、2k、4k等,根據(jù)移動(dòng)觀象臺(tái)數(shù)據(jù)顯示,20164季度,安卓設(shè)備前五名分辨率占比75%,前十名占比88%,但排名第100名的分辨率也占到0.01%,這一數(shù)據(jù)不一定精確,但反映了分辨率千差萬(wàn)別,主流集中的特點(diǎn),另外有部分手機(jī)內(nèi)置虛擬按鍵(如華為),會(huì)導(dǎo)致屏幕可用分辨率發(fā)生變化。


屏幕尺寸方面,可分為穿戴設(shè)備、手機(jī)、平板和電視等,穿戴設(shè)備和電視一般是針對(duì)特定硬件開發(fā),我涉及的也不多,這里不討論,手機(jī)的特點(diǎn)是屏幕大小基本與手掌相當(dāng),目前一般集中在5-5.5寸,而平板則屏幕大小相差較大,一般7-11寸。


屏幕長(zhǎng)寬比不同,這個(gè)與分辨率的多樣性是相關(guān)的,有4:3,16:9等,不過這個(gè)差異一般不是太明顯,就拿電視來說,從以前的方形電視,到目前主流偏寬的電視,都是可以觀看的,可能稍有拉伸。

 

Android屏幕適配方式;


1 適配方式之 dp

 

    分辨率:eg480*800,1280*720。表示物理屏幕區(qū)域內(nèi)像素點(diǎn)的總和。(切記:跟屏幕適配沒有任何關(guān)系)

 

因?yàn)槲覀兗瓤梢园?/span> 1280*720 的分辨率做到 4.0 的手機(jī)上面。


我也可以把 1280*720 的分辨率做到 5.0 英寸的手機(jī)上面,如果分辨率相同,手機(jī)屏幕越小清晰。

 

    px(pix):像素,就是屏幕中最小的一個(gè)顯示單元

 

    dpi(像素密度):即每英寸屏幕所擁有的像素?cái)?shù),像素密度越大,顯示畫面細(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 中沒有圖片資源,其他目錄中都有,當(dāng)我們將該應(yīng)用部署 mdpi 分辨率的手機(jī)上時(shí),那么該應(yīng)用會(huì)查找分辨率較高目錄下的資源文件,如果較高分辨率目錄下也沒有資源則只好找較低目錄中的資源了。

 

常見手機(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 目錄類似的,在 Android 工程的 res 目錄下有 values 目錄,這個(gè)是默認(rèn)的目錄,同時(shí)為了適配不同尺寸

 

手機(jī)我們可以創(chuàng)建一個(gè) values-1280x720 的文件夾,同時(shí)將 dimens.xml 文件拷貝到該目錄下。 dimens.xml 中定義一個(gè)尺寸。 values-1280x720 目錄中的 dimens.xml 中定義同樣的尺寸名稱,但是使用不同的尺寸。當(dāng)我們?cè)诓季治募惺褂瞄L(zhǎng)或者寬度單位時(shí),應(yīng)該使用@dimen/width 來靈活的定義寬度。

 

3,適配方式之 layout

 

values 一樣,在 Android 工程目錄中 layout 目錄也支持類似 values 目錄一樣的適配,在 layout 中我們可以針對(duì)不同手機(jī)的分辨率制定不同的布局,

 

4,適配方式之 java 代碼適配

 

就是獲取屏幕的寬度,根據(jù)你的圖片的寬高比,通過屏幕的寬度動(dòng)態(tài)的算出圖片的高度。通過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 類是一個(gè)常量類,很簡(jiǎn)單,只有兩個(gè)常量用來記錄屏幕的寬和高,其代碼清單如下:

public class Constant {

public static int srceenHeight;

public static int srceenWidth;

}

 

5, 適配方式之 weight 權(quán)重適配

 

在控件中使用屬性 android:layout_weight=”1”可以起到適配效果,但是該屬性的使用有如下規(guī)則:只能用在線性控件中,比如 LinearLayout。豎直方向上使用權(quán)重的控件高度必須為 0dpGoogle 官方的推薦用法)水平方向上使用權(quán)重的控件寬度必須為 0dpGoogle 官方的推薦用法)。


手機(jī)自適應(yīng)主要分為兩種情況:橫屏和豎屏的切換,以及分辨率大小的不同。

 

橫屏和豎屏的切換:

 

1、Android 應(yīng)用程序支持橫豎屏幕的切換,Android 中每次屏幕的切換動(dòng)會(huì)重啟 Activity,所以應(yīng)該在 Activity銷毀(執(zhí)行 onPause()方法和 onDestroy()方法)前保存當(dāng)前活動(dòng)的狀態(tài);在 Activity 再次創(chuàng)建的時(shí)候載入配置,那樣,進(jìn)行中的游戲就不會(huì)自動(dòng)重啟了!有的程序適合從豎屏切換到橫屏,或者反過來,這個(gè)時(shí)候怎么辦呢?可以在配 Activity 的地方進(jìn)行如下的配置 android:screenOrientation=”portrait”landscape 是橫向,portrait 是縱向)。這樣就可以保證是豎屏總是豎屏了。

 

2、而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置 Activity 的時(shí)候進(jìn)行如下的配置:android:configChanges=”keyboardHidden|orientation” , 另 外 需 要 重 寫 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)容來源于網(wǎng)絡(luò),侵刪

常見問題

京公網(wǎng)安備 11010802036823號(hào)

   

京ICP備16051929號(hào)

   

增值電信業(yè)務(wù)許可證編號(hào):京B2-20190686

   

專利代理機(jī)構(gòu)代碼:16087

   

人力資源服務(wù)許可證編號(hào):1101082019043

   

代理記賬許可證書編號(hào):DLJZ11010820210015

0