android自適應屏幕方向和大小

一:不一樣的layout
Android手機 屏幕 大小不一,有480x320, 640x360, 800x480.怎樣才能讓App自動 適應不一樣的 屏幕  呢?  
     其實很簡單,只須要在res目錄下建立不一樣的layout文件 夾,好比layout-640x360,layout-800x480,全部的layout文件在編譯 以後都會寫入R.java裏,而系統 會根據 屏幕  的大小本身選擇合適的layout進行使用。
 
二:hdpi、mdpi、ldpi
在以前的版本中,只有一個drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個,這三個主要是爲了支持多分辨率。

  drawable- hdpi、drawable- mdpi、drawable-ldpi的區別:

  (1)drawable-hdpi裏面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)

  (2)drawable-mdpi裏面存放中等分辨率的圖片,如HVGA (320x480)

  (3)drawable-ldpi裏面存放低分辨率的圖片,如QVGA (240x320)

  系統會根據機器的分辨率來分別到這幾個文件夾裏面去找對應的圖片。

  在開發程序 時爲了兼容不一樣平臺不一樣 屏幕  ,建議各自文件夾根據需求均存放不一樣版本圖片。
 
 
3、 屏幕  方向
橫屏豎屏自動切換:
      能夠在res目錄下創建layout-port和layout-land兩個目錄,裏面分別放置豎屏和橫屏兩種佈局文件,這樣在手機 屏幕  方向變化的時候系統會自動調用相應的佈局文件,避免一種佈局文件沒法知足兩種 屏幕  顯示的問題。
還有一種辦法:只要在androidmanifest.xml中對應的Activity中加入sensor屬性便可實現屏幕自動翻轉,如:
  Xml代碼
  <
  activity android:name=".demo"
  android:label="@string/app_name"
  android:screenOrientation="sensor"
  >
 
橫屏豎屏不切換:
還要說明一點:每一個activity 都有這個屬性screenOrientation,每一個activity都須要設置 ,能夠設置爲豎屏(portrait),也能夠設置爲無重力感應(nosensor)。

要讓程序界面保持一個方向,不隨手機方向轉動而變化的處理辦法:  
  
在AndroidManifest.xml裏面配置一下就能夠了。加入這一行android :screenOrientation="landscape"。
例如(landscape是橫向,portrait是縱向):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.ray.linkit"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
                <activity android:name=".GamePlay"
                android:screenOrientation="portrait"></activity>
                <activity android:name=".OptionView"
                android:screenOrientation="portrait"></activity>
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest>
 
 
4、 另外,android中每次 屏幕  的切換動會重啓Activity,因此應該在Activity銷燬前保存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的遊戲就不會自動重啓了!
可是屏幕自動翻轉也伴隨着一個問題:當窗體切換或者佈局切換時,Activity中OnCreate方法會被重複調用。通常OnCreate中會初始化一些數據,重複調用可能會產生意想不到的後果。解決方法以下:
  在androidmanifest.xml中的activit元素加入configChanges這個屬性,好比
  Xml代碼
  <
  activity android:name="demo"
  android:configChanges="orientation|keyboardHidden"
  android:label="@string/app_name"
  >
另外,在Activity的Java文件中重載onConfigurationChanged(Configuration newConfig)這個方法,這樣就不會在佈局切換或窗口切換時重載onCreate等方法。代碼以下:
  Java代碼
  public void onConfigurationChanged(Configuration newConfig)
  {
  super.onConfigurationChanged(newConfig);
  if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
  {
  //TO-DO
  }
  else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
  {
  //TO-DO
  }
  }
 
還有界面設計方面的問題,Android手機大部分是HVGA、WVGA的分辨率,屏幕視覺上比較「狹長」。每每豎着看很合適的佈局,當屏幕橫向翻轉之後顯示會變得很彆扭。當屏幕由豎直方向改變爲橫向時,咱們能夠把界面中的控件由原本的垂直線性佈局修改成橫向線性佈局,這樣佈局會更合理一些。咱們能夠本身寫一個佈局類集成LinearLayout佈局,經過覆蓋onMeasure方法來實現這種自動佈局。當屏幕的寬高發生改變時,系統會調用 onMeasure方法。經過這個方法,咱們能夠得到改變之後的寬高尺寸,從而來實現屏幕翻轉的自動佈局,主要代碼以下:
  Java代碼
  /**
  * 屏幕改變時自動調用
  * @param widthMeasureSpec 改變後的寬度
  * @param heightMeasureSpec 改變後的高度
  */
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
  {
  /*寬度*/
  int screenWith = View.MeasureSpec.getSize(widthMeasureSpec);
  /*高度*/
  int screenHeight = View.MeasureSpec.getSize(heightMeasureSpec);
  /*豎直佈局*/
  if (screenWith < screenHeight)
  {
  this.setOrientation(VERTICAL);
  for (int i = 0; i < getChildCount(); i++)
  {
  View childView = getChildAt(i);
  if (childView instanceof CakyCanvas)
  {
  /*該控件佔佈局的2/5*/
  LayoutParams params = new LayoutParams(screenWith,
  screenHeight * 2/ 5
  updateViewLayout(childView, params);
  }
  else if (childView instanceof CakyExplainCanvas)
  {
  /*該控件佔佈局的3/5*/
  LayoutParams params = new LayoutParams(screenWith,
  screenHeight * 3/ 5
updateViewLayout(childView, params);
  }
  }
  }
  /*橫向佈局*/
  else
  {
  this.setOrientation(HORIZONTAL);
  for (int i = 0; i < getChildCount(); i++)
  {
  View childView = getChildAt(i);
  if (childView instanceof CakyCanvas)
  {
  LayoutParams params = new LayoutParams(
  screenWith * 2/ 5
  screenHeight);
  updateViewLayout(childView, params);
  }
  else if (childView instanceof CakyExplainCanvas)
  {
  LayoutParams params = new LayoutParams(
  screenWith * 3/ 5
  screenHeight);
  updateViewLayout(childView, params);
  }
  }
  }
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  }
 
 
5、有的程序適合從豎屏切換到橫屏,或者反過來,這個時候怎麼辦呢?能夠在配置Activity的地方進行以下的配置android:screenOrientation="portrait"。這樣就能夠保證是豎屏老是豎屏了,或者landscape橫向。
 
6、而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行以下的配置:android:configChanges="keyboardHidden|orientation",另外須要重寫Activity的 onConfigurationChanged方法。實現方式以下,不須要作太多的內容:
 
@Override
        public void onConfigurationChanged(Configuration newConfig) {
                super.onConfigurationChanged(newConfig);
                if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                        // land do nothing is ok
                } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                        // port do nothing is ok
                }
        }
 

7、屏幕分辨率適配html

 
屏幕分辨率: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獲得,須要四捨五入。

以此類推
通常狀況下須要建立出values 、values-mdpi 、 values-hdpi文件夾,以備在一些沒有規定的尺寸屏幕上找不到資源的狀況。

而後在裏面使用不一樣的dimens文件,Layout中不要使用顯示的數字,全部的尺寸定義全都援引dimens裏面的內容。

在工程的default.properties中若是split.density=false,則分辨率適配的時候文件夾命名不須要與scale相除

屏幕分辨率:800x480
density:1.5(240)
文件夾:values-hdpi-800x480
 
這樣可以保證深度UI定製的狀況

 

8、關於Android的nodpi,xhdpi,hdpi,mdpi,ldpijava

首先是幾個基本概念:
1.屏幕尺寸Screen size
即顯示屏幕的實際大小,按照屏幕的對角線進行測量。
爲簡單起見,Android把全部的屏幕大小分爲四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).
應用程序能夠爲這四種尺寸分別提供不一樣的自定義屏幕布局-平臺將根據屏幕實際尺寸選擇對應佈局進行渲染,這種選擇對於程序側是透明的。
2.屏幕長寬比Aspect ratio
長寬比是屏幕的物理寬度與物理高度的比例關係。應用程序能夠經過使用限定的資源來爲指定的長寬比提供屏幕布局資源。
 
3.屏幕分辨率Resolution
在屏幕上顯示的物理像素總和。須要注意的是:儘管分辨率一般用寬x高表示,但分辨率並不意味着具體的屏幕長寬比。
在Andorid系統中,應用程序不直接使用分辨率。
4.密度Density
根據像素分辨率,在屏幕指定物理寬高範圍內能顯示的像素數量。
在一樣的寬高區域,低密度的顯示屏能顯示的像素較少,而高密度的顯示屏則能顯示更多的像素。
屏幕密度很是重要,由於其它條件不變的狀況下,一共寬高固定的UI組件(好比一個按鈕)在在低密度的顯示屏上顯得很大, 而在高密度顯示屏上看起來就很小。
爲簡單起見,Android把全部的屏幕分辨率也分爲四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).
應用程序能夠爲這四種尺寸分別提供不一樣的資源-平臺將透明的對資源進行縮放以適配指定的屏幕分辨率。
5.設備獨立像素Density-independent pixel (dp)
應用程序能夠用來定義UI組件的虛擬像素單元,經過密度無關的方式來描述佈局尺寸和位置。
一個設備獨立像素至關於一個160 dpi屏幕上的物理像素。
在程序運行時,系統根據屏幕的實際密度透明的處理任何須要縮放的設備獨立像素單元,設備獨立像素轉換成屏幕實際像素的換算很簡單:pixels = dps * (density / 160).
例如在240 dpi的屏幕上,1個設備獨立像素等於1.5物理像素.爲確保UI組件在不一樣的屏幕都能合適的展現,強烈建議使用設備獨立像素單元來定義你的應用程序UI。
四種屏幕尺寸分類:: small, normal, large, and xlarge
四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
須要注意的是: xhdpi是從   Android   2.2 (API Level 8)纔開始增長的分類.
xlarge是從Android 2.3 (API Level 9)纔開始增長的分類.
DPI是「dot per inch」的縮寫,每英寸像素數。
通常狀況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
兩種獲取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
//這裏獲得的像素值是設備獨立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 這樣得到的參數信息不正確,不要使用這種方式。
不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。這個獲得的寬和高是空的。
 
若是須要爲Android pad定製資源文件,則res目錄下的目錄可能爲:
drawable
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable- nodpi
drawable-nodpi-1024×600
drawable-nodpi-1280×800
drawable-nodpi-800×480
values
values-ldpi
values-mdpi
values-hdpi
values-xhdpi
values-nodpi
values-nodpi-1024×600
values-nodpi-1280×800
values-nodpi-800×480
 
 
參考:http://blog.csdn.net/pilou5400/article/details/6018374
來源:android自適應屏幕方向和大小
http://www.apkbus.com/android-15882-1-1.html(出處: Android開發論壇 - 安卓開發論壇 - Android開發 - 安卓論壇 - 移動互聯網門戶)
相關文章
相關標籤/搜索