屏幕方向 是对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)发生变化时被回调。

更多相关文章

  1. Android开源图表库介绍
  2. Android(安卓)屏幕设置
  3. Android入门学习笔记之人机用户界面
  4. 一个Demo让你掌握所有的android控件
  5. 解决Android编辑框在全屏模式下无法检测布局变化的问题
  6. Android(安卓)重力感应获取手机运动方向和角度
  7. ImageView的scaletype属性
  8. Android(安卓)网络显示图片
  9. android中textView周围显示图片

随机推荐

  1. dom 操作与事件
  2. Python利用itchat模块定时给朋友发送微信
  3. C语言中字符型数据和浮点型数据介绍
  4. 表单事件,字符串,数组apl
  5. 数组常用api
  6. javascript得dom编程初体验
  7. 流程控制、字面量与函数
  8. 流程控制和函数和返回值
  9. JS函数类型及数据类型
  10. 学习了事件的冒泡与事件的委托代理以及表