Android Activity屏幕旋转方向完全控制

我们知道,系统提供了Android:configChanges="orientation" 清单文件属性以监听屏幕旋转,进而触发onConfigurationChanged方法。

但这有时不能完全满足我们的需求。比如典型的应用场景:视频播放器的屏幕方向锁功能。

下面贡献屏幕旋转完全控制类ActivityRotationController,解决一切屏幕旋转问题。

[java]  view plain  copy
  1. import android.app.Activity;  
  2. import android.content.ContentResolver;  
  3. import android.content.pm.ActivityInfo;  
  4. import android.provider.Settings;  
  5. import android.provider.Settings.SettingNotFoundException;  
  6. import android.view.OrientationEventListener;  
  7.   
  8.   
  9. /** 
  10.  * 该类可以对Activity旋转和方向进行更加灵活的控制。 
  11.  * 注意,使用该类进行方向控制的Activity不要在清单文件中添加: 
  12.  * android:configChanges="orientation"  
  13.  *  
  14.  * 典型的应用场景: 
  15.  * 视频播放器的屏幕方向锁功能。 
  16.  * 当锁住屏幕方向后,Activity就不会随着手机方向的旋转而改变方向。一旦打开锁,Activity将会立即随着屏幕的方向而改变。 
  17.  *  
  18.  * 一般调用代码: 
  19.  *  
  20.  * 默认打开锁 
  21.  * ActivityRotationController controller=new ActivityRotationController(this); 
  22.  *  
  23.  * 打开锁 
  24.  * controller.openActivityRotation(); 
  25.  *  
  26.  * 关闭锁 
  27.  * controller.closeActivityRotation(); 
  28.  *  
  29.  * 关闭监听,恢复到系统之前旋转设定 
  30.  * controller.disable() 
  31.  *  
  32.  * 要求的权限 
  33.  * @permission android.permission.WRITE_SETTINGS 
  34.  */  
  35.   
  36. public class ActivityRotationController extends OrientationEventListener {  
  37.     private int systemRotation;  
  38.     private boolean activityRotation;  
  39.     private int activityOrientation;  
  40.     private Activity activity;  
  41.   
  42.     public ActivityRotationController(Activity activity) {  
  43.         super(activity);  
  44.         this.activity = activity;  
  45.         activityOrientation = activity.getResources().getConfiguration().orientation;  
  46.         try {  
  47.             systemRotation = getScreenRotation(activity.getContentResolver());  
  48.         } catch (SettingNotFoundException e) {  
  49.             e.printStackTrace();  
  50.             systemRotation = -1;  
  51.         }  
  52.           
  53.         openActivityRotation();  
  54.         enable();  
  55.     }  
  56.   
  57.     /** 
  58.      * 打开Activity旋转。 
  59.      * 如果打开了屏幕旋转,Activity将接收屏幕旋转事件并执行onConfigurationChanged方法。 
  60.      */  
  61.     public void openActivityRotation() {  
  62.         activityRotation = true;  
  63.     }  
  64.   
  65.     /** 
  66.      * 关闭Activity旋转。 
  67.      * 无论是否打开屏幕旋转,Activity都不能接收到屏幕旋转事件。 
  68.      */  
  69.     public void closeActivityRotation() {  
  70.         activityRotation = false;  
  71.     }  
  72.   
  73.     /** 
  74.      * 检查Activity能否旋转 
  75.      */  
  76.     public boolean isActivityRotationEnabled() {  
  77.         return activityRotation;  
  78.     }  
  79.   
  80.     /** 
  81.      * 获取Activity当前方向。 
  82.      * 注意,Activity方向不是屏幕方向。只有打开Activity旋转,Activity方向才和屏幕方向保持一致。 
  83.      */  
  84.     public int getActivityOrientation() {  
  85.         return activityOrientation;  
  86.     }  
  87.   
  88.     /** 
  89.      * 打开对屏幕旋转的监听,并设置屏幕为可旋转。 
  90.      */  
  91.     @Override  
  92.     public void enable() {  
  93.         super.enable();  
  94.         setScreenRotation(activity.getContentResolver(), 0);  
  95.     }  
  96.   
  97.     /** 
  98.      * 关闭对屏幕旋转的监听,并恢复到系统之前旋转设定。 
  99.      */  
  100.     @Override  
  101.     public void disable() {  
  102.         super.disable();  
  103.         if (systemRotation == -1) {  
  104.             return;  
  105.         }  
  106.         setScreenRotation(activity.getContentResolver(), systemRotation);  
  107.     }  
  108.   
  109.     @Override  
  110.     public void onOrientationChanged(int orientation) {  
  111.         if (orientation < 0) {  
  112.             return;  
  113.         }  
  114.           
  115.         int newOrientation= ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;  
  116.         if (orientation >= 0 && orientation <= 60) {  
  117.             newOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;  
  118.         }else if (orientation >60 && orientation <120) {  
  119.             newOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;  
  120.         }else if (orientation >=120 && orientation <=240) {  
  121.             newOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;  
  122.         }else if (orientation >240 && orientation <300) {  
  123.             newOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;  
  124.         }else if (orientation >=300 && orientation <=360) {  
  125.             newOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;  
  126.         }else{  
  127.             return;  
  128.         }  
  129.           
  130.         if ((newOrientation != orientation) && activityRotation) {  
  131.             activity.setRequestedOrientation(newOrientation);  
  132.             activityOrientation = newOrientation;  
  133.         }  
  134.     }  
  135.   
  136.     private void setScreenRotation(ContentResolver cr, int rotation) {  
  137.         Settings.System.putInt(cr, Settings.System.ACCELEROMETER_ROTATION,  
  138.                 rotation);  
  139.     }  
  140.   
  141.     private int getScreenRotation(ContentResolver cr)  
  142.             throws SettingNotFoundException {  
  143.         return Settings.System.getInt(cr,  
  144.                 Settings.System.ACCELEROMETER_ROTATION);  
  145.     }  
  146.   
  147. }  

作者:薄荷记账  (转载请注明原作者)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值