详解Android中的屏幕方向
屏幕方向 是对Activity而言的,所以你可以在AndroidManifest.xml 文件中,通过<activity> 标记的screenOrientation 属性进行设定,例如:
- <activity
- android:name=".SketchpadActivity"
- android:screenOrientation="landscape"/><!--让该Activity总是显示为横屏-->
screenOrientations属性共有7中可选值(常量定义在 android.content.pm.ActivityInfo类中 ) :
- landscape:横屏(风景照) ,显示时宽度大于高度;
- portrait:竖屏 (肖像照) , 显示时 高 度大于 宽 度 ;
- user:用户当前的首选方向;
- behind:继承Activity堆栈中当前Activity下面的那个Activity的方向;
- sensor:由物理感应器决定显示方向,它取决于用户如何持有设备,当 设备 被旋转时方向会随之变化——在横屏与竖屏之间;
- nosensor:忽略物理感应器——即显示方向与物理感应器无关,不管用户如何旋转设备显示方向都不会随着改变("unspecified"设置除外);
- unspecified :未指定,此为默认值,由Android系统自己选择适当的方向,选择策略视具体设备的配置情况而定,因此不同的设备会有不同的方向选择;
以上配置值会反映在Activity.getRequestedOrientation()方法的返回值中,与之对应的setRequestedOrientation()方法可以通过API的方式动态改变该属性的值,如以下示例将在横屏/竖屏两个方向上进行切换:
- /*
- * 通过API动态改变当前屏幕的显示方向
- */
- public void apiChangeOrientation() {
- // 取得当前屏幕方向
- int orient = getRequestedOrientation();
- Logger.get().i("orientation:" + MyUtils.getOrientationName(orient));
- // 若非明确的landscape或portrait时 再透过宽高比例的方法来确认实际显示方向
- // 这会保证orient最终值会是明确的横屏landscape或竖屏portrait
- if (orient != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
- && orient != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
- //宽>高为横屏,反正为竖屏
- int[] size = MyUtils.getDisplaySize(this);
- orient = size[0] < size[1] ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
- : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
- Logger.get().i("w/h:" + MyUtils.getOrientationName(orient));
- }
- if (orient == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- }else{
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- }
- }
通过setRequestedOrientation(xxx)方法设置与在 AndroidManifest.xml文件中配置是等效的,因此通过以上例程明确指定方向后,Activity将不再自动根据物理传感器进行横竖屏切 换,若要恢复,再调用setRequestedOrientation(UNSPECIFIED)即可。
另外, 还可以通过Configuration对象来取得Activity当前的显示方向:
- // 通过Configuration对象 确认当前显示方向
- Configuration conf = getResources().getConfiguration();
- String orientName = "undefined";
- switch (orient) {
- case Configuration.ORIENTATION_LANDSCAPE:
- orientName = "landscape";
- case Configuration.ORIENTATION_PORTRAIT:
- orientName = "portrait";
- case Configuration.ORIENTATION_SQUARE:
- orientName = "square";
- default:
- orientName = "undefined";
- }
- Logger.get().i("conf.orient:" + orientName);
需要注意的是两者(ActivityInfo和Configuration)有关方向的常量定义是不一致的,ActivityInfo中有关常量是用于决策显示方向的策略,而Configuration对象中的常量则是明确的 实际 显示方向,共有4中可能:未定义(UNDEFINED) 、横屏 (LANDSCAPE) 、竖屏 (PORTRAIT) 、以及正方形 (SQUARE) 。
最后来看看,如何在程序中捕获显示方向改变的事件,这得从Activity.onConfigurationChanged方法说起。
Android系统会根据设备的配置变化(如屏幕方向的变化)来重新加载不同的资源文件(如 布局 layout资源),它会通过终止并重启Activity来实现 资源 的 重新加载。如果我们向其申明要自己处理(某些) 配置变化,则必须自己负责相关资源的重新加载——也就是说目标Activity不会在 (某些) 配置变化时,再经历 终止并重启的过程了。
我们关注显示方向的变化,需要在Activity申明时指定configChanges属性等于orientation,示例如下:
- <activity
- android:name=".MyActivity"
- android:configChanges="orientation"
- android:label="@string/app_name"/>
事实上configChanges属性还有:fontScale(用户首先字体大小改变)、locale(用户的语言环境设定改变)、keyboard(键盘类型改变)等多种可选值 。
然后再覆写 Activity. onConfigurationChanged 方法, 例如:
- // 设备配置发生变化时回调
- public void onConfigurationChanged(Configuration conf) {
- //super.onConfigurationChanged(conf);
- //TODO:YOU Process...
- }
这样当屏幕方向改变时以上方法会被回调。需要再次强调的是,只有在configChanges中指定的配置项发生变化时才会回调onConfigurationChanged,因此上面的方法仅在屏幕方向(orientation)发生变化时被回调。
详解Android中的屏幕方向的更多相关文章
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- 详解Android中AsyncTask的使用
在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...
- 详解Android中那些酷炫返回方式的实现
Android手机都会有返回键,不管是实体键,还是虚拟键.Android用户主要也都是通过这个返回键操控页面返回方式的,不比IOS逼格甚高的只保留一个操作键.这种方式是最普遍的返回方式,还有一种也是比 ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- 详解android:scaleType属性
详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262 http://juliaailse. ...
- (转载)实例详解Android快速开发工具类总结
实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...
- 图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...
- adb shell 命令详解,android
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
- 详解Android Activity---启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
随机推荐
- Oracle 显示时间问题
在部署的时候. 显示的时间为会 2014/1/1 9:00:00 pm 但开发过程中显示为正常: 2014-1-1 21:00:00 解决方法: 1. Oracle数据库的时间格式没有问题, ...
- Solr Schema.xml和solrconfig.xml分析(转)
Solr Schema.xml和solrconfig.xml分析 (http://yinwufeng.iteye.com/blog/964040) 一.字段配置(schema) schema.xml位 ...
- Codeforces Round #277 (Div. 2)
整理上次写的题目: A: For a positive integer n let's define a function f: f(n) = - 1 + 2 - 3 + .. + ( - 1)nn ...
- ObjectStore onFetch方法获取记录总数
转自:http://blog.csdn.net/earthhour/article/details/38686029 ObjectStore onFetch方法获取记录总数 require(['doj ...
- mysql 权限 备份
mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...
- 正确使用HTML title属性
如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...
- [C++]类的继承与派生
继承性是面向对象程序设计的第二大特性,它允许在既有类的基础上创建新类,新类可以继承既有类的数据成员和成员函数,可以添加自己特有的数据成员和成员函数,还可以对既有类中的成员函数重新定义.利用类的继承和派 ...
- Webpack+React配合开发
前面两篇关于webpack的基础和进阶,请先务必阅读之前的文章. Webpack教程一 Webpack教程二 什么是React React是一个由Facebook开发的library,它的口号是“A ...
- Baidu和Google搜索引擎使用技巧(转)
转自:Baidu和Google搜索 http://www.douban.com/note/261208979/ 百度搜索一:基本搜索 二:高级搜索 谷歌搜索一:基本搜索1)可部分匹配也可完全匹 ...
- light oj 1068 - Investigation 数位DP
思路:典型的数位DP!!! dp[i][j][k]:第i位,对mod取余为j,数字和对mod取余为k. 注意:由于32位数字和小于95,所以当k>=95时,结果肯定为0. 这样数组就可以开小点, ...