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

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-misc-widgets

    `DrawerLayout`是官方提供的组件,用于在主屏幕侧边创建一个可滑出的抽屉,而`SlidingPaneLayout`则允许在水平方向上滑动两个视图。 2. 上下抽屉:在Android中,上下抽屉效果相对较少见,但可以通过自定义布局和...

    Android-PullLayout.zip_Android-PullLayout_android

    考虑到Android设备的多样性,PullLayout需要处理不同的屏幕尺寸、分辨率和设备方向。在设计时,开发者需要确保布局在横屏和竖屏模式下都能正常工作,同时保持良好的可读性和触摸反馈。 五、集成与使用 在实际项目...

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

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

    android改变变屏幕方向.docx

    在Android开发中,屏幕方向是一个重要的考虑因素,因为它直接影响到用户体验和应用的视觉效果。本文将深入探讨Android系统中如何管理和控制屏幕方向。 首先,屏幕方向的设置主要针对`Activity`,开发者通常会在`...

    android-support-v7-recyclerview.jar.zip

    2. LayoutManager:布局管理器负责决定视图如何在屏幕上布局,如线性布局(LinearLayoutManager)、网格布局(GridLayoutManager)和瀑布流布局(StaggeredGridLayoutManager)。 3. Adapter:适配器是数据和视图...

    android-ui-utils,从code.google.com/p/android-ui-utils自动导出.zip

    - 图片处理:包括裁剪、缩放、旋转等操作,使得图片可以更好地适应不同的屏幕尺寸和方向。 2. **ViewUtils**: - 动画与过渡效果:提供了多种视图动画,如淡入淡出、平移、旋转等,为界面增添动态美感。 - 视图...

    android-navigation-drawer.7z

    7. **适配不同的屏幕尺寸和方向**:确保导航抽屉在不同设备和屏幕方向下都能正常工作。 导航抽屉是Android Material Design规范的一部分,遵循这一规范可以使应用具有统一且直观的用户体验。在实际项目中,开发者...

    Android-Hauler是一个实现了用手势滑动关闭Activity的Android库

    然而,Android-Hauler库引入了一种新的交互方式,允许用户通过在屏幕边缘滑动来关闭当前的Activity。这一特性常见于许多现代应用,如Google的Material Design指南所提倡的设计模式。 使用Android-Hauler库,开发者...

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

    4. **处理配置变更**:当屏幕方向改变时,Android可能会销毁并重建活动。为了防止数据丢失,可以重写`onSaveInstanceState()`来保存状态,并在`onCreate()`或`onRestoreInstanceState()`中恢复。 5. **权限检查**:...

    Android-Android根据OrientationEventListener获取设备的方向

    `OrientationEventListener`是一个轻量级的API,用于监听设备的屏幕方向改变。它可以监听到设备的三个基本方向:正向(portrait)、横向(landscape)以及反向横向(reverse landscape)。在用户改变设备方向时,会...

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

    本篇文章将深入探讨如何控制Android Activity的屏幕方向,实现始终横屏、全屏显示以及如何处理屏幕方向改变时Activity的销毁与重建问题。 1. **屏幕始终横屏或竖屏** 在AndroidManifest.xml中,我们可以为特定的...

    Android-StepView-用于Android的简单动画步骤视图

    5. **适应性**:兼容不同尺寸和方向的屏幕,保证在各种设备上都能良好显示。 6. **可扩展性**:方便添加额外的功能,如步骤描述、错误提示等。 在实际项目中,StepView可能应用于购物车结账流程、设置向导、任务...

    Android-联系人A-Z索引列表

    9. **适配不同屏幕尺寸**: 考虑到Android设备的多样性,确保字母索引列表在不同分辨率和屏幕方向下都能正常工作。 10. **可访问性**: 确保功能对视力障碍的用户友好,可能需要提供语音反馈或者其他辅助功能。 总的...

    Android-Android自动文字公告栏。支持上下左右4个方向滚出。

    它是一个定制化的控件,名为AutoScrollTextView,能够实现文字在屏幕上的自动滚动效果,而且滚动方向非常灵活,包括上、下、左、右四个方向,从而增加了用户界面的动态性和多样性。 AutoScrollTextView是基于...

    android-sliding-layer-lib-master.zip

    3. **State Management**:SlidingLayer维护了自身的状态(打开、关闭、半开等),并提供了相应的回调方法,以便在状态改变时通知开发者。 集成与自定义: 1. **添加依赖**:首先,开发者需要将库的aar文件添加到...

    Android-Android实现了可以滑动左侧边缘退出Activity的功能

    我们需要在这个方法中计算手指的起始和结束位置,判断滑动方向是否是从屏幕左侧向右侧,并根据滑动距离和速度来决定是否触发退出Activity的操作。 接下来,我们要考虑视图层级管理。在Android中,布局通常由多个...

    android-input-text-layout.7z

    例如,使用`android:background`属性可以改变边框样式,`android:textColorHint`可设定提示文本颜色。 2. **输入验证**: 对于用户输入的验证,开发者可以监听`TextWatcher`事件,实时检查用户输入是否符合预期。...

    屏幕方向锁定后自动旋转.zip

    通过指定`orientation`,当屏幕方向改变时,系统会调用`onConfigurationChanged`而不是销毁并重建活动。 总的来说,这个压缩包提供的资源可以帮助开发者学习如何在Android应用中实现屏幕方向锁定功能,避免不必要的...

    Android-选择分辨率并自动生成对应的dimen.xml文件

    Android屏幕分为多个类别:LDPI(低密度),MDPI(中密度),HDPI(高密度),XHDPI(超高清密度)等。每个类别对应不同的像素密度,例如MDPI为160dpi,HDPI为240dpi。屏幕分辨率则表示水平和垂直方向上的像素数量...

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

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

Global site tag (gtag.js) - Google Analytics