`
nanjingjiangbiao_T
  • 浏览: 2599907 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android--屏幕方向的改变

 
阅读更多

如果设备的配置(在Resources.Configuration中进行了定义)发生改变,那么所有用户界面上的东西都需要进行更新,以适应新的配置。因为Activity是与用户交互的最主要的机制,它包含了处理配置改变的专门支持。除非你特殊指定,否则当配置发生改变(比如屏幕方向、语言、输入设备等等的改变)时你当前的activity都将被销毁,这销毁是通过一个正常的activity生命周期过程(onFreeze(Bundle) , onPause() , onStop() ,onDestroy())进行的。如果activity之前正在前景画面,当这个实例的onDestroy()调用完成后将会启动这个activity的一个新的实例,并将前面那个实例中onFreeze(Bundle)所保存的内容传递给新的实例。因为任何的应用资源(包括layout文件)都有可能由于任何配置值而改变。因此处理配置改变的唯一安全的方法就是重新获取所有的资源,包括layout、绘图资源(原文drawables)、字符串资源。由于activity已经如何保存自己的状态并从这些状态中重建自身,所以activity重新启动自身来获得新的配置将是一个非常便利的途径。在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activityonConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。


下面给出两个例子说明屏幕的改变事件。

1.点击按钮改变屏幕的方向

实现的截图如下:


实现这个例子用到的代码如下:

public class EX05_22 extends Activity
{
  private TextView mTextView01;
  private Button mButton01;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    /* 方法又需要用到的Display对象 */
    final Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay();
    
    mButton01 = (Button)findViewById(R.id.myButton1); 
    mTextView01 = (TextView)findViewById(R.id.myTextView1);
    
    if(getRequestedOrientation()==-1)
    {
      mTextView01.setText(getResources().getText(R.string.str_err_1001));
    }
    
    /* 当按下按钮旋转屏幕画面 */
    mButton01.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View arg0)
      {
        /* 方法一:重写getRequestedOrientation */
        
        /* 若无法取得screenOrientation属性 */
        if(getRequestedOrientation()==-1)
        {
          /* 提示无法进行画面旋转叫能,帆无法??Orientation */
          mTextView01.setText(getResources().getText(R.string.str_err_1001));
        }
        else
        {
          if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
          {
            /* 若当前为横式,则变更为直式显示 */
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
          }
          else if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
          {
            /* 若当前为直式,则变更为横式显示 */
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
          }
        }
        
        /* 方法二:判断屏幕宽高比(扩展学习) */
        int h= defaultDisplay.getHeight();
        int w = defaultDisplay.getWidth();
        
        /* 否分辨率为按钮按下当下的分辨率 */
        mTextView01.setText(Integer.toString(h)+"x"+Integer.toString(w));
        
        //if(w > h)
        //{
          /* Landscape */
          /* 重写Activity里的setRequestedOrientation()方法 */
        //  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        //}
        //else
        //{
          /* Portrait */
        //  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        //}
      }      
    });
  }

  @Override
  public void setRequestedOrientation(int requestedOrientation)
  {
    // TODO Auto-generated method stub
    
    /* 判断要变更的方向,以Toast提示 */
    switch(requestedOrientation)
    {
      case (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE):
        mMakeTextToast
        (
          getResources().getText(R.string.str_msg1).toString(),
          false
        );
        break;
      case (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT):
        mMakeTextToast
        (
          getResources().getText(R.string.str_msg2).toString(),
          false
        );
        break;
    }
    super.setRequestedOrientation(requestedOrientation);
  }

  @Override
  public int getRequestedOrientation()
  {
    // TODO Auto-generated method stub
    
    /* 此重写getRequestedOrientation方法,可取得当前屏幕的方向 */
    return super.getRequestedOrientation();
  }
  
  public void mMakeTextToast(String str, boolean isLong)
  {
    if(isLong==true)
    {
      Toast.makeText(EX05_22.this, str, Toast.LENGTH_LONG).show();
    }
    else
    {
      Toast.makeText(EX05_22.this, str, Toast.LENGTH_SHORT).show();
    }
  }
}

2.动态改变屏幕的方向,并重载函数

 public void onConfigurationChanged(Configuration newConfig)
这时需要两个权限的说明

2.1

<!-- 必須設定CHANGE CONFIGURATION權限 -->
  <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

2.2
 <!-- 必須設定activity的configChanges屬性 -->
    <activity
      android:name=".EX05_23"
      android:label="@string/app_name"
      android:configChanges="orientation|keyboard">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>


实现的效果与第一个例子相同。

下面给出完整的实现代码:

public class EX05_23 extends Activity
{
  private TextView mTextView01;
  private Button mButton01;
  
  /* 屏幕宽高 */
  private int intScreenH,intScreenW;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    /* 声明Display对象,以取得屏幕宽高 */
    final Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay();
    intScreenH= defaultDisplay.getHeight();
    intScreenW = defaultDisplay.getWidth();
    
    mButton01 = (Button)findViewById(R.id.myButton1); 
    mTextView01 = (TextView)findViewById(R.id.myTextView1);
    mTextView01.setText(Integer.toString(intScreenW)+"x"+Integer.toString(intScreenH));
    
    /* 当宽>高,表示为横式显示 */
    if(intScreenW > intScreenH)
    {
      /* Landscape */
      mButton01.setText(R.string.str_button2);
    }
    else
    {
      /* Portrait */
      mButton01.setText(R.string.str_button1);
    }
    
    /* 按钮事件处理切换宽高 */
    mButton01.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        // TODO Auto-generated method stub
        intScreenH= defaultDisplay.getHeight();
        intScreenW = defaultDisplay.getWidth();
        
        /* 如果为Landscape */
        if(intScreenW > intScreenH)
        {
          /* Landscape => Portrait */
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else
        {
          /* Portrait => Landscape */
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        
        /* 再一次取得屏幕宽高 */
        intScreenH= defaultDisplay.getHeight();
        intScreenW = defaultDisplay.getWidth();
        mTextView01.setText(Integer.toString(intScreenW)+"x"+Integer.toString(intScreenH));
      }
    });
  }  
  
  @Override
  public void onConfigurationChanged(Configuration newConfig)
  {
    // TODO Auto-generated method stub
    
    /* 覆写onConfigurationChanged事件,捕捉当设定之后的值 */
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
      /* 趁着事件发生之后,变更按钮上的文字 */
      mButton01.setText(R.string.str_button2);
      mMakeTextToast
      (
        getResources().getText(R.string.str_onConf_LANDSCAPE).toString(),
        false
      );
    }
    
    /* 须设定configChanges属性才能捕捉onConfigurationChanged */
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
      mButton01.setText(R.string.str_button1);
      mMakeTextToast
      (
        getResources().getText(R.string.str_onConf_PORTRAIT).toString(),
        false
      );
    }
    
    if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO)
    {
     
    }
    super.onConfigurationChanged(newConfig);
  }
  
  public void mMakeTextToast(String str, boolean isLong)
  {
    if(isLong==true)
    {
      Toast.makeText(EX05_23.this, str, Toast.LENGTH_LONG).show();
    }
    else
    {
      Toast.makeText(EX05_23.this, str, Toast.LENGTH_SHORT).show();
    }
  }
}


分享到:
评论

相关推荐

    Android 屏幕旋转(改变屏幕方向).rar

    Android 屏幕旋转实例,改变屏幕方向,这个和平时的锁定屏幕方向有关联,其基本的实现思路如下:  public void onConfigurationChanged(Configuration newConfig) {   Toast.makeText(this, "系统的屏幕方向发生...

    android改变变屏幕方向.docx

    android改变变屏幕方向.docx

    迅为4412开发板-Android系统屏幕旋转设置

    客户需要根据自己的产品设计及应用环境,切换屏幕的显示方向,或者固定好一个显示方向,例如产品中使用不同分辨率的显示屏,或者显示屏在产品中的固定方向发生改变等等,都需要进行屏幕旋转功能。 那么如何设置屏幕的...

    android Activity始终横屏、全屏、屏幕方向改变等屏幕相关.doc

    android Activity始终横屏、全屏、屏幕方向改变等屏幕相关

    Android改变手机屏幕朝向的方法

    主要介绍了Android改变手机屏幕朝向的方法,涉及Android动态更改手机屏幕朝向的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    强制改变屏幕方向的小工程

    Android强制横竖屏切换的一个工具代码,灰常的简单实用~

    新版Android开发教程.rar

    � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从计算机为主改成从手机使用为导向。新 生应用如:G oogle 地图及其衍生应用、 GMail 、 GTalk 等。 � GPS 卫星导航功能,手机照相, MP3 ,蓝芽等均...

    Android屏幕大小相关技巧应用指南.docx

    在这里我们就可以为大家详细介绍一下有关Android屏幕大小的自适应方式,帮助大家理解。不同的Androidtarget会有不同的大小,应用程序的界面需要针对不同的大小调整界面元素的尺寸。而且Android屏幕大小也可以在横屏...

    android改变方向

    这个app展示了在屏幕方向改变的时候app经历的步骤。

    Maze 400 迷宫 android小游戏项目源码 JavaScript Java

    在屏幕上滑动以改变方向并引导点穿过迷宫。 MAZE 400:你在这个流行的游戏的任务很简单:找到出口,逃离迷宫!在屏幕上滑动以改变方向并引导点穿过迷宫。从三种模式中选择一种适合您的偏好: * 经典模式与越来越困难...

    Android开发 旋转屏幕导致Activity重建解决方法

    “屏幕方向”(orientation)是一个Configuration,通过查看Configuration类的javadoc可以看到其他Configuration还有哪些:如fontScale、keyboardHidden和locale等等。 当屏幕旋转时,这个Configuration就发生了...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    5.22 动态更改屏幕方向——LANDSCAPE与PORTRAIT 5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 ...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    5.22 动态更改屏幕方向——LANDSCAPE与PORTRAIT 5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 ...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    5.22 动态更改屏幕方向——LANDSCAPE与PORTRAIT 5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 ...

    Android开发应用实战详解源代码

    5.18 变换屏幕的方向 5.19 获取设备信息 5.20 小结 第6章 手机自动服务 6.1 实现短信提醒 6.2 剩余电量提醒 6.3 短信群发 6.4 短信e-mail通知 6.5 来电提醒 6.5.1 实现原理 6.5.2 telephonymanager和...

    android实现在横竖屏切换时页面信息不被重置的示例分享

    当屏幕转动切换的时候 Android 机制是:销毁当前屏幕的 Activity ,然后重新开启一个新的适应屏幕改变的 Activity 。那么,我们该如何在屏幕切换的...表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行 onCrea

    Android天气预报应用

    (4)在用户改变手机方向导致屏幕在横屏和竖屏之间切换时,能够根据实际情况对界面布局进行调整。 (5)如果不能查询到相应城市的天气信息,则需要进行异常判断和处理 (6)提供更换皮肤的功能(让用户在内置皮肤或...

    Android 手机系统中的重力传感器+源码

    Android 手机系统中的重力传感器+源码,作者信息:Himi,重力传感器也称为加速度传感器,源代码编译环境需要SDK 1.5(api 3)支持。  此传感器不仅对玩家反转手机的动作可以检测到,而且会根据反转手机的程度,得到...

Global site tag (gtag.js) - Google Analytics