Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android中正確自適應屏幕翻轉

Android中正確自適應屏幕翻轉

編輯:高級開發

大家都知道,很多android手機帶有重力感應傳感器,能夠對手機的翻轉做出響應。比如應用在屏幕的自動翻轉、重力感應游戲等方面。

  只要在androidmanifest.XML中對應的Activity中加入sensor屬性即可實現屏幕自動翻轉,如:

  XML代碼

  <

  activity android:name=".demo"

  android:label="@string/app_name"

  android:screenOrIEntation="sensor"

  >

  <

  activity android:name=".demo"

  android:label="@string/app_name"

  android:screenOrIEntation="sensor"

  >

  但是屏幕自動翻轉也伴隨著一個問題:當窗體切換或者布局切換時,Activity中OnCreate方法會被重復調用。一般OnCreate中會初始化一些數據,重復調用可能會產生意想不到的後果。解決方法如下:

  在androidmanifest.XML中的activit元素加入configChanges這個屬性,比如

  XML代碼

  <

  activity android:name="demo"

  android:configChanges="orIEntation|keyboardHidden"

  android:label="@string/app_name"

  >

  <

  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

  }

  }

  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);

  }

  /**

  * 屏幕改變時自動調用

  * @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);

  }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved