Android Activity螢幕旋轉方向完全控制
阿新 • • 發佈:2019-02-17
我們知道,系統提供了Android:configChanges="orientation" 清單檔案屬性以監聽螢幕旋轉,進而觸發onConfigurationChanged方法。
但這有時不能完全滿足我們的需求。比如典型的應用場景:視訊播放器的螢幕方向鎖功能。
下面貢獻螢幕旋轉完全控制類ActivityRotationController,解決一切螢幕旋轉問題。
- import android.app.Activity;
- import android.content.ContentResolver;
-
import android.content.pm.ActivityInfo;
- import android.provider.Settings;
- import android.provider.Settings.SettingNotFoundException;
- import android.view.OrientationEventListener;
- /**
- * 該類可以對Activity旋轉和方向進行更加靈活的控制。
- * 注意,使用該類進行方向控制的Activity不要在清單檔案中新增:
- * android:configChanges="orientation"
- *
- * 典型的應用場景:
- * 視訊播放器的螢幕方向鎖功能。
-
* 當鎖住螢幕方向後,Activity就不會隨著手機方向的旋轉而改變方向。一旦開啟鎖,Activity將會立即隨著螢幕的方向而改變。
- *
- * 一般呼叫程式碼:
- *
- * 預設開啟鎖
- * ActivityRotationController controller=new ActivityRotationController(this);
- *
- * 開啟鎖
- * controller.openActivityRotation();
- *
- * 關閉鎖
- * controller.closeActivityRotation();
- *
- * 關閉監聽,恢復到系統之前旋轉設定
- * controller.disable()
- *
- * 要求的許可權
-
* @permission android.permission.WRITE_SETTINGS
- */
- publicclass ActivityRotationController extends OrientationEventListener {
- privateint systemRotation;
- privateboolean activityRotation;
- privateint activityOrientation;
- private Activity activity;
- public ActivityRotationController(Activity activity) {
- super(activity);
- this.activity = activity;
- activityOrientation = activity.getResources().getConfiguration().orientation;
- try {
- systemRotation = getScreenRotation(activity.getContentResolver());
- } catch (SettingNotFoundException e) {
- e.printStackTrace();
- systemRotation = -1;
- }
- openActivityRotation();
- enable();
- }
- /**
- * 開啟Activity旋轉。
- * 如果打開了螢幕旋轉,Activity將接收螢幕旋轉事件並執行onConfigurationChanged方法。
- */
- publicvoid openActivityRotation() {
- activityRotation = true;
- }
- /**
- * 關閉Activity旋轉。
- * 無論是否開啟螢幕旋轉,Activity都不能接收到螢幕旋轉事件。
- */
- publicvoid closeActivityRotation() {
- activityRotation = false;
- }
- /**
- * 檢查Activity能否旋轉
- */
- publicboolean isActivityRotationEnabled() {
- return activityRotation;
- }
- /**
- * 獲取Activity當前方向。
- * 注意,Activity方向不是螢幕方向。只有開啟Activity旋轉,Activity方向才和螢幕方向保持一致。
- */
- publicint getActivityOrientation() {
- return activityOrientation;
- }
- /**
- * 開啟對螢幕旋轉的監聽,並設定螢幕為可旋轉。
- */
- @Override
- publicvoid enable() {
- super.enable();
- setScreenRotation(activity.getContentResolver(), 0);
- }
- /**
- * 關閉對螢幕旋轉的監聽,並恢復到系統之前旋轉設定。
- */
- @Override
- publicvoid disable() {
- super.disable();
- if (systemRotation == -1) {
- return;
- }
- setScreenRotation(activity.getContentResolver(), systemRotation);
- }
- @Override
- publicvoid onOrientationChanged(int orientation) {
- if (orientation < 0) {
- return;
- }
- int newOrientation= ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
- if (orientation >= 0 && orientation <= 60) {
- newOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
- }elseif (orientation >60 && orientation <120) {
- newOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
- }elseif (orientation >=120 && orientation <=240) {
- newOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
- }elseif (orientation >240 && orientation <300) {
- newOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
- }elseif (orientation >=300 && orientation <=360) {
- newOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
- }else{
- return;
- }
- if ((newOrientation != orientation) && activityRotation) {
- activity.setRequestedOrientation(newOrientation);
- activityOrientation = newOrientation;
- }
- }
- privatevoid setScreenRotation(ContentResolver cr, int rotation) {
- Settings.System.putInt(cr, Settings.System.ACCELEROMETER_ROTATION,
- rotation);
- }
- privateint getScreenRotation(ContentResolver cr)
- throws SettingNotFoundException {
- return Settings.System.getInt(cr,
- Settings.System.ACCELEROMETER_ROTATION);
- }
- }
作者:薄荷記賬 (轉載請註明原作者)