android禁止横屏和竖屏切换

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);设置拍摄照片应该旋转的角度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值