Android实现屏幕旋转方法总结

   Android实现屏幕旋转方法总结

        这篇文章主要介绍了Android实现屏幕旋转方法,实例总结了屏幕旋转的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

  本文实例总结了Android实现屏幕旋转方法。分享给大家供大家参考。具体如下:

  在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:

  默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。

  了解了这些以后,我们对android的屏幕旋转方法进行如下总结:

  1. AndroidManifest.xml设置

  如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

  ?

1
2

android:screenOrientation="landscape"横屏设置;
android:screenOrientation="portrait"竖屏设置;

  这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。

  缺点:屏幕只有一个方向。

  2. 代码动态设置

  如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

  ?

1
2
3
4
5
6

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//横屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//竖屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
//默认设置

  这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;

  缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

  3. 重写onConfigurationChanged

  如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:

  首先,在AndroidMainfest.xml中添加configChanges:

  ?

1
2
3

<activity android:name=".Test"
android:configChanges="orientation|keyboard">
</activity>

  注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;

  ?

1

android:configChanges="keyboardHidden|orientation|screenSize"

  然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:

  ?

1
2
3
4
5
6
7
8

public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);
if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
// Nothing need to be done here
} else {
// Nothing need to be done here
}
}

  这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;

  缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

  4. 结合OrientationEventListener,自定义旋转监听设置

  如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:

  首先,创建OrientationEventListener对象:

  ?

1
2
3
4

private OrientationEventListener mOrientationListener;
// screen orientation listener
private boolean mScreenProtrait = true;
private boolean mCurrentOrient = false;

  然后,自定义屏幕变化回调接口

  ?

1
2

abstract protected void OrientationChanged(int orientation);
//screen orientation change event

  最后,自定义监听类

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

private final void startOrientationChangeListener() {
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int rotation) {
if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation>=135)&&(rotation<=225))) {//portrait
mCurrentOrient = true;
if(mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Log.d(TAG, "Screen orientation changed from Landscape to Portrait!");
}
}
else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))) {//landscape
mCurrentOrient = false;
if(mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Log.d(TAG, "Screen orientation changed from Portrait to Landscape!");
}
}
}
};
mOrientationListener.enable();
}

  在onCreate()中调用:

  ?

1

startOrientationChangeListener();

  这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;

  注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。

  希望本文所述对大家的Android程序设计有所帮助。

时间: 2024-10-30 11:45:12

Android实现屏幕旋转方法总结的相关文章

Android实现屏幕旋转方法总结_Android

本文实例总结了Android实现屏幕旋转方法.分享给大家供大家参考.具体如下: 在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制: 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间.如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个

Android手机屏幕录像方法

  一个Android手机屏幕录像的软件了,使用也非常方便,在此贡献给大家 虽然论坛上已经有了安致手机截屏的软件,使用也很方便.但是有时候视频演示效果会很好.今天在googlecode上发现了一个好用的在windows.linux和mac下都能使用的捕获视频的工具: http://code.google.com/p/androidscreencast/ 使用java web start技术,因此可以通过浏览器直接使用.   左边是程序录制的界面,右边是视频播放的界面.效果不错. 使用很简单: 首

iOS 6中控制屏幕旋转支持方向的方法

在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController的旋屏方向支持,比如: - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPo

Android屏幕旋转和Configuration的使用

MainActivity如下: package cn.testconfigurationchange; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.content.res.Configuration; /**

详解Android中Runtime解决屏幕旋转问题(推荐)_Android

前言 大家或许在iOS程序开发中经常遇到屏幕旋转问题,比如说希望指定的页面进行不同的屏幕旋转,但由于系统提供的方法是导航控制器的全局方法,无法随意的达到这种需求.一般的解决方案是继承UINavrgationViewController,重写该类的相关方法,这样虽然也能解决问题,但是在重写的过程中至少产生两个多余的文件和不少的代码,这显然不是我们想要的.下面就使用一种较底层的方法解决这个问题. 基本原理 动态的改变UINavrgationViewController的全局方法,将我们自己重写的su

Android屏幕旋转 处理Activity与AsyncTask的最佳解决方案

一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务,以便恢复activity的状态. 为此,google提供了三种解决方案: 对于少量数据: 通过onSaveInstanceState(),保存有关应用状态的数据. 然后在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态. 对于大量数据:用

Android手机保持屏幕高亮方法

  这篇文章主要介绍了Android手机保持屏幕高亮方法,本文直接给出实现代码,需要的朋友可以参考下 一开始接触android应用项目时,在项目快上线时策划要求加个高亮,每次都是直接从网上百度一下,现在做游戏了,却还是这个需求,这里备份一下方便后续的查找,毕竟是自己写好且验证没问题的 :) 首先,在Activity里添加一下代码: 成员变量: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 pri

Android获取屏幕或View宽度和高度的方法_Android

本文实例讲述了Android获取屏幕或View宽度和高度的方法.分享给大家供大家参考,具体如下: 在Activity中获取屏幕的高度和宽度 Display display=getWindowManager().getDefaultDisplay(); int width=display.getWidth(); int height=display.getHeight(); 在重写ViewGroup中获取屏幕的有效宽度和高度在OnMesure方法中 protected void onMeasure

iOS开发中控制屏幕旋转的编写方法小结_IOS

在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController的旋屏方向支持,比如: 复制代码 代码如下: - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  {      return (interfaceOrientation == UIInter