L遷客

          技術(shù)博客
          隨筆 - 1, 文章 - 12, 評論 - 1, 引用 - 0
          數(shù)據(jù)加載中……

          Android程序?qū)Σ煌謾C(jī)屏幕分辨率自適應(yīng)的總結(jié)

          Android程序?qū)Σ煌謾C(jī)屏幕分辨率自適應(yīng)的總結(jié)

            各種Android操作系統(tǒng)的手機(jī)簡直就是琳瑯滿目,屏幕分辨率的差異可想而知。目前比較主流的有WVGA=800x480HVGA=480x320,另外的還有QVGA=320x240。當(dāng)然還有魅族M9DVGA=960x640,還有蛋疼的摩托羅拉的FWVGA=854x480。

            其實(shí),在你layoutxml文件中,編寫的時(shí)候是不是用了許多的padding呢?如果是,那你就蛋疼了。因?yàn)檫@樣的布局永遠(yuǎn)是無法適應(yīng)所有手機(jī)屏幕的。

            正確的做法應(yīng)該是使用的是weight屬性。將你控件的layout中的width、height設(shè)置為fill-parent,不要使用wrap——content。因?yàn)?/span>wrap-content的大小是不固定的。而weight(權(quán)重)這個(gè)屬性很好的解決了這個(gè)問題。

            當(dāng)包裹在控件外面的Layoutwidth、height屬性都設(shè)置為fill-parent時(shí),可以利用weight的反比特性。即如果控件A設(shè)置weight5,控件B設(shè)置weight7,那么A所占的空間為5/5+7),B所占的空間為7/5+7)。這樣的反比屬性對任何分辨率下的手機(jī)都是合適的。


            當(dāng)然,字體就不行了。那怎么保證字體能夠跟布局一樣能夠自適應(yīng)呢?
            呵呵,很簡單,就是在你的res文件夾中創(chuàng)建一個(gè)文件夾,叫做values-320x240。其中320x240是你手機(jī)屏幕的分辨率,根據(jù)你手機(jī)屏幕的情況做不同的命名,例如values- 800x480。在該文件夾下創(chuàng)建一個(gè)dimens.xml文件,定義各種字體的大小。那么系統(tǒng)就會自動(dòng)根據(jù)你手機(jī)屏幕的分辨率去調(diào)用響應(yīng)的文件夾。


              另外,值得提醒的是,記得在你默認(rèn)的values文件下的dimens.xml文件中也要寫上相應(yīng)的字體大小哦,因?yàn)楫?dāng)系統(tǒng)無法認(rèn)識你手機(jī)屏幕大小的時(shí)候,它會自動(dòng)去找你默認(rèn)文件中的

          東西,沒有寫的話程序會崩潰。

          ************************************************************分割線************************************************************

            在看下面內(nèi)容之前首先請看你SDK文檔中以下這篇文章

            其實(shí)google在分辨率適應(yīng)性的東西已經(jīng)寫的很清楚了,只是我們很多人沒去看而已

            以下是結(jié)論:
              屏幕分辨率:1024x600
              density1160
              文件夾:values-mdpi-1024x600

              屏幕分辨率:1024x600
              density1.5240
              文件夾:values-hdpi-683x400  1024/1.5  600/1.5得到,需要四舍五入。

              屏幕分辨率:800x480
              density1160
              文件夾:values-mdpi-800x480

              屏幕分辨率:800x480
              density1.5240
              文件夾:values-hdpi-533x320  800/1.5  480/1.5得到,需要四舍五入。

            以此類推
              一般情況下需要?jiǎng)?chuàng)建出values 、values-mdpi 、 values-hdpi文件夾,以備在一些沒有規(guī)定的尺寸屏幕上找不到資源的情況。

              然后在里面使用不同的dimens文件,Layout中不要使用顯示的數(shù)字,所有的尺寸定義全都援引dimens里面的內(nèi)容。

              這樣能夠保證深度UI定制的情況

              另外在工程的default.properties中如果split.density=false,則分辨率適配的時(shí)候文件夾命名不需要與scale相除

            例
            屏幕分辨率:800x480
            density1.5240
            文件夾:values-hdpi-800x480

          ************************************************************分割線************************************************************

            關(guān)于dimens 

              位置:res\values
              單位:px   Pixel 以畫面的像素為單位;
                   in     Inches以畫面的多少英寸為單位;
                   mm  Millimeter以畫面的多少毫米為單位;
                   pt     Points 一點(diǎn)為1/72英寸;
                   dpdip  Density-indepentdent 160dpi屏幕的一個(gè)pixel;
                   ap Scale-independent Pixels 隨屏幕尺寸改變的一個(gè)pixel;

           

           

            不同的Android target會有不同的大小,應(yīng)用程序的界面需要針對不同的大小調(diào)整界面元素的尺寸。而且Android屏幕大小也可以在橫屏和豎屏之間切換,界面也需要調(diào)整。

            如何取得屏幕的方向:

            默認(rèn)情況下,當(dāng)屏幕方面切換時(shí),activityonCreate()方法會被重新調(diào)用,所以可以在其中通過以下代碼來讀取屏的方向:

            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就不會重復(fù)的調(diào)用onCreate()onPause()onResume().

            而是調(diào)用onConfigurationChanged(Configuration newConfig)

            如何取得Android屏幕大?。?/span>

            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) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 崇左市| 洮南市| 榆林市| 渑池县| 花莲市| 河北区| 安化县| 蒙山县| 新民市| 昌黎县| 济南市| 贺州市| 宜兰县| 弋阳县| 略阳县| 安国市| 泰兴市| 阿城市| 尖扎县| 大庆市| 兰溪市| 洪洞县| 河北省| 银川市| 平乐县| 平阳县| 房产| 仲巴县| 专栏| 桃源县| 沁水县| 南宫市| 平远县| 昌图县| 特克斯县| 和硕县| 金山区| 蒙自县| 法库县| 枝江市| 泸西县|