Android程序?qū)Σ煌謾C(jī)屏幕分辨率自適應(yīng)的總結(jié)
Android程序?qū)Σ煌謾C(jī)屏幕分辨率自適應(yīng)的總結(jié)
各種Android操作系統(tǒng)的手機(jī)簡(jiǎn)直就是琳瑯滿目,屏幕分辨率的差異可想而知。目前比較主流的有WVGA=800x480,HVGA=480x320,另外的還有QVGA=320x240。當(dāng)然還有魅族M9的DVGA=960x640,還有蛋疼的摩托羅拉的FWVGA=854x480。
其實(shí),在你layout的xml文件中,編寫的時(shí)候是不是用了許多的padding呢?如果是,那你就蛋疼了。因?yàn)檫@樣的布局永遠(yuǎn)是無(wú)法適應(yīng)所有手機(jī)屏幕的。
正確的做法應(yīng)該是使用的是weight屬性。將你控件的layout中的width、height設(shè)置為fill-parent,不要使用wrap——content。因?yàn)?/span>wrap-content的大小是不固定的。而weight(權(quán)重)這個(gè)屬性很好的解決了這個(gè)問(wèn)題。
當(dāng)包裹在控件外面的Layout的width、height屬性都設(shè)置為fill-parent時(shí),可以利用weight的反比特性。即如果控件A設(shè)置weight為5,控件B設(shè)置weight為7,那么A所占的空間為5/(5+7),B所占的空間為7/(5+7)。這樣的反比屬性對(duì)任何分辨率下的手機(jī)都是合適的。
當(dāng)然,字體就不行了。那怎么保證字體能夠跟布局一樣能夠自適應(yīng)呢?
呵呵,很簡(jiǎn)單,就是在你的res文件夾中創(chuàng)建一個(gè)文件夾,叫做values-320x240。其中320x240是你手機(jī)屏幕的分辨率,根據(jù)你手機(jī)屏幕的情況做不同的命名,例如values- 800x480。在該文件夾下創(chuàng)建一個(gè)dimens.xml文件,定義各種字體的大小。那么系統(tǒng)就會(huì)自動(dòng)根據(jù)你手機(jī)屏幕的分辨率去調(diào)用響應(yīng)的文件夾。
另外,值得提醒的是,記得在你默認(rèn)的values文件下的dimens.xml文件中也要寫上相應(yīng)的字體大小哦,因?yàn)楫?dāng)系統(tǒng)無(wú)法認(rèn)識(shí)你手機(jī)屏幕大小的時(shí)候,它會(huì)自動(dòng)去找你默認(rèn)文件中的
東西,沒(méi)有寫的話程序會(huì)崩潰。
************************************************************分割線************************************************************
在看下面內(nèi)容之前首先請(qǐng)看你SDK文檔中以下這篇文章
其實(shí)google在分辨率適應(yīng)性的東西已經(jīng)寫的很清楚了,只是我們很多人沒(méi)去看而已
以下是結(jié)論:
屏幕分辨率:1024x600
density:1(160)
文件夾:values-mdpi-1024x600
屏幕分辨率:1024x600
density:1.5(240)
文件夾:values-hdpi-683x400 由1024/1.5 600/1.5得到,需要四舍五入。
屏幕分辨率:800x480
density:1(160)
文件夾:values-mdpi-800x480
屏幕分辨率:800x480
density:1.5(240)
文件夾:values-hdpi-533x320 由800/1.5 480/1.5得到,需要四舍五入。
以此類推
一般情況下需要?jiǎng)?chuàng)建出values 、values-mdpi 、 values-hdpi文件夾,以備在一些沒(méi)有規(guī)定的尺寸屏幕上找不到資源的情況。
然后在里面使用不同的dimens文件,Layout中不要使用顯示的數(shù)字,所有的尺寸定義全都援引dimens里面的內(nèi)容。
這樣能夠保證深度UI定制的情況
另外在工程的default.properties中如果split.density=false,則分辨率適配的時(shí)候文件夾命名不需要與scale相除
例
屏幕分辨率:800x480
density:1.5(240)
文件夾:values-hdpi-800x480
************************************************************分割線************************************************************
關(guān)于dimens
位置:res\values
單位:px Pixel 以畫面的像素為單位;
in Inches以畫面的多少英寸為單位;
mm Millimeter以畫面的多少毫米為單位;
pt Points 一點(diǎn)為1/72英寸;
dp或dip Density-indepentdent 為160dpi屏幕的一個(gè)pixel;
ap Scale-independent Pixels 隨屏幕尺寸改變的一個(gè)pixel;
不同的Android target會(huì)有不同的大小,應(yīng)用程序的界面需要針對(duì)不同的大小調(diào)整界面元素的尺寸。而且Android屏幕大小也可以在橫屏和豎屏之間切換,界面也需要調(diào)整。
如何取得屏幕的方向:
默認(rèn)情況下,當(dāng)屏幕方面切換時(shí),activity的onCreate()方法會(huì)被重新調(diào)用,所以可以在其中通過(guò)以下代碼來(lái)讀取屏的方向:
1.view plaincopy to clipboardprint?
2.public void onCreate() {
3.if(this.getResources().getConfiguration()
.orientation == Configuration.ORIENTATION_LANDSCAPE) {
4.Log.i("info", "landscape");
5.} else if (this.getResources().getConfiguration()
.orientation == Configuration.ORIENTATION_PORTRAIT) {
6.Log.i("info", "portrait");
7.}
8.}
9.public void onCreate() {
10.if(this.getResources().getConfiguration()
.orientation == Configuration.ORIENTATION_LANDSCAPE) {
11.Log.i("info", "landscape");
12.} else if (this.getResources().getConfiguration()
.orientation == Configuration.ORIENTATION_PORTRAIT) {
13.Log.i("info", "portrait");
14.}
15.}
如果在androidmanifest.xml中加入配置
android:configChanges="orientation|keyboardHidden|navigation
當(dāng)屏幕翻轉(zhuǎn)時(shí),Activity就不會(huì)重復(fù)的調(diào)用onCreate()、onPause()和onResume().
而是調(diào)用onConfigurationChanged(Configuration newConfig)
如何取得Android屏幕大小:
1.view plaincopy to clipboardprint?
2.int screenWidth,screenHeight;
3.WindowManager windowManager = getWindowManager();
4.Display display = windowManager.getDefaultDisplay();
5.screenWidth = display.getWidth();
6.screenHeight = display.getHeight();
7.int screenWidth,screenHeight;
8.WindowManager windowManager = getWindowManager();
9.Display display = windowManager.getDefaultDisplay();
10.screenWidth = display.getWidth();
11.screenHeight = display.getHeight();
也有人提到另一種Android屏幕大小的更改方法:
1.view plaincopy to clipboardprint?
2.DisplayMetrics dm = new DisplayMetrics();
3.getWindowManager().getDefaultDisplay().getMetrics(dm);
4.int screenWidth = dm.widthPixels;
5.int screenHeight = dm.heightPixels;
posted on 2013-02-24 16:50 L遷客 閱讀(135) 評(píng)論(0) 編輯 收藏