最新历史版本 :Android中正确自适应屏幕翻转

转载 2012年03月25日 21:03:15
大家都知道,很多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);

  }


Android中正确自适应屏幕翻转

大家都知道,很多Android手机带有重力感应传感器,能够对手机的翻转做出响应。比如应用在屏幕的自动翻转、重力感应游戏等方面。  只要在androidmanifest.xml中对应的Activity中...

android 自适应屏幕翻转

  • 2011年11月30日 11:38
  • 20KB
  • 下载

解决 android 高低版本 webView 里内容 自适应屏幕的终极方法

一,先说下我的情况,大家可以对号入座(嫌无聊请跳过)       我的项目要求是这样的,先从数据库里面拿出来html标签,因为加载到移动端的网页内容是用户在网页编辑好了之后提交到服务器的,即网页...

解决 android 高低版本 webView 里内容 自适应屏幕的终极方法

http://www.cnblogs.com/linguanh/p/4927353.html 解决 android 高低版本 webView 里内容 自适应屏幕的终极方法 转载请声...

cocos2d-x 2.0版本 自适应屏幕分辨率

  • 2012年12月04日 23:59
  • 1.15MB
  • 下载

andorid最新的不规则色彩背景图片自适应屏幕宽高,背景不变形

先在这里吐槽一下万恶的客户改需求... 再说一句...网上大部份资料都是坑爹的.因为不是针对你需求来写的....别照抄..你只能从多种答案中总结出自己的代码.自己的方法 所谓不规则背景图片是指...

Unity3D NGUI自适应屏幕分辨率 最新

http://blog.csdn.net/asd237241291/article/details/8126619

22.android 自适应屏幕

  • 2015年12月18日 15:06
  • 2.09MB
  • 下载

Android自适应屏幕分辨率

  • 2012年11月16日 17:43
  • 19KB
  • 下载

cocos2d-x 2.0版本 自适应屏幕分辨率

我使用的版本是cocos2d-2.0-x-2.0.4,cocos2dx-2.0版本对多分辨率适配提供了很好的支持,使用起来比1.0版本要简单些,1.0版本的适配可以参考这篇博文。 1. 做2.0版本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最新历史版本 :Android中正确自适应屏幕翻转
举报原因:
原因补充:

(最多只允许输入30个字)