您的位置:首页 > 移动开发 > Android开发

android禁止横屏和竖屏切换

2011-12-31 17:10 726 查看
http://dev.10086.cn/cmdn/bbs/thread-55994-1-1.html

1.actiivty的屏幕方向属性有7个值

android:screenOrientation=""

//SCREEN_ORIENTATION_BEHIND: 继承Activity堆栈中当前Activity下面的那个Activity的方向

//SCREEN_ORIENTATION_LANDSCAPE: 横屏(风景照) ,显示时宽度大于高度 ,是固定的,不会随着手机的横竖而改变屏幕布局,不会销毁当前activity
//SCREEN_ORIENTATION_PORTRAIT: 竖屏 (肖像照) , 显示时高度大于宽度 是固定的,不会随着手机的横竖而改变屏幕布局。 不会销毁当前activity

//SCREEN_ORIENTATION_NOSENSOR: 忽略物理感应器——即显示方向与物理感应器无关,
不管用户如何旋转设备显示方向都不会随着改变("unspecified"设置除外)
//SCREEN_ORIENTATION_SENSOR: 由物理感应器决定显示方向,它取决于用户如何持有设备,
当设备被旋转时方向会随之变化——在横屏与竖屏之间,效果和SCREEN_ORIENTATION_UNSPECIFIED一样
//SCREEN_ORIENTATION_UNSPECIFIED: 此为默认值,-1 未指定,由Android系统自己选择适当的方向,
选择策略视具体设备的配置情况而定,因此不同的设备会有不同的方向选择,activity会随着手机方向的改变而切换成
横屏或竖屏显示,切换时会销毁当前的activity,new一个新的activity,触发生命周期方法,但如果添加了这个属性

android:configChanges="orientation",就不会销毁当前的activity


//SCREEN_ORIENTATION_USER: 用户当前的首选方向
2.如何在代码中设置和查询屏幕方向属性

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

getRequestedOrientation() //测试出activity默认的屏幕属性是SCREEN_ORIENTATION_UNSPECIFIED,getRequestedOrientation这个方法得到的似乎也不一定是当前真实的手机方向,好像只是配置文件中配置的属性值。

3.监听手机方向的更改

可以扩展onConfigurationChanged(Configuration newConfig)方法来监听手机方向的更改,但是前提是一定要在为activity配置属性

android:configChanges="orientation",否则activity会销毁而执行onCreate()方法


@Override

public void onConfigurationChanged(Configuration newConfig)

{

int ori =newConfig.orientation;//获取手机的方向

Log.i("sqk","==onConfigurationChanged");

switch (ori) {

case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:

Log.i("sqk","==landscape");

break;

case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:

Log.i("sqk","==PORTRAIT");

break;

}

//不能省略,否则会报android.app.SuperNotCalledException: Activity OrientationActivity did not

//call through to super.onConfigurationChanged()异常

super.onConfigurationChanged(newConfig);

}

有的人说要添加权限 android.permission.CHANGE_CONFIGURATION",但经我测试,这个是不需要的。

在某些场合可能需要禁止横屏和竖屏切换,实现这个要求很简单,只要在AndroidManifest.xml里面加入这一行android:screenOrientation="landscape "(landscape 是横向,portrait 是纵向)。不过android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置。在activity加上

android:configChanges="orientation|keyboard|keyboardHidden"

属性,添加上面配置属性的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。就不会重启activity这样就可以在这个方法里调整显示方式.

如何获取当前手机的真正方向?

android自带的照相机应用上就有。

com.android.camera包下的Camera类中有一个内部类 private class MyOrientationEventListener extends OrientationEventListener并实现了方法public void onOrientationChanged(int orientation)。方法传进的参数orientation以平常竖直放置为0(也就是360度),顺时针旋转orientation增加至359。同时Camera类有一个成员变量mOrientation用来记录屏幕当前的位置,它的值根据orientation并由算法
((orientation + 45) / 90 * 90) % 360算出。实际上当手机竖直放置左偏44度和右偏44度,mOrientation为0,右偏45时,mOrientation为90(即手机顺时针旋转45度以后,就认为手机从竖屏变成横屏,并且手机真实的顶部由向上变成向右)。这里记住mOrientation就是用来保存屏幕当前横屏竖屏的标志。拍照是在Camera的内部类private class ImageCapture中private void capture()方法由mOrientation的值根据是前置摄像头(算法:rotation
= (info.orientation - mOrientation + 360) % 360;),还是后置摄像头(算法:rotation = (info.orientation + mOrientation) % 360;)得出值rotation的值,这个值就是要传到设备的内部类Parameters对象(中间层Camera类的内部类,用来设置白平衡,图片大小等参数的类)用来设置拍摄照片应该旋转的角度,调用方法 mParameters.setRotation(rotation);设置拍摄照片应该旋转的角度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: