屏幕旋轉切換機制詳解
前言
屏幕旋轉的機制;
默認情況下,當用戶手機的重力感應器打開后,旋轉屏幕方向,會導致當前activity發生onDestroy-> onCreate,這樣會重新構造當前activity和界面布局,如果在Camera界面,則表現為卡頓或者黑屏一段時間;
今天就介紹下平面旋轉方面的知識點;
一、screenOrientation屬性說明
android:screenOrientation屬性說明:
- unspecified,默認值,由系統決定,不同手機可能不一致
- landscape,強制橫屏顯示,只有一個方向
- portrait,強制豎屏顯,只有一個方向
- behind,與前一個activity方向相同
- sensor,根據物理傳感器方向轉動,用戶90度、180度、270度旋轉手機方向,activity都更著變化,會重啟activity(無論系統是否設置為自動轉屏,activity頁面都會跟隨傳感器而轉屏)
- sensorLandscape,橫屏旋轉,就是可以上下旋轉,有兩個方向,不會重啟activity
- sensorPortrait,豎屏旋轉,就是可以上下旋轉,有兩個方向,不會重啟activity
- nosensor,旋轉設備時候,界面不會跟著旋轉。初始化界面方向由系統控制(無論系統是否設置為自動轉屏,activity頁面都不會轉屏)
- user,用戶當前設置的方向
- reverseLandscape,與正常的橫向方向相反顯示(反向橫屏)
- reversePortrait,與正常的縱向方向相反顯示(反向豎屏)(我設置沒用)
二、屏幕旋轉詳解
1、配置文件設置
AndroidManifest.xml設置;
- android:name=".test1"
- android:screenOrientation="landscape" />
- android:name=".test2"
- android:screenOrientation="portrait" />
橫屏或者豎屏是被直接定死,旋轉方向不會變化,只有一個方向(意思是旋轉180°也不會改變),當然就不會在手機旋轉的時候重啟activity;
2、代碼設置
調用setRequestedOrientation()函數,其效果就是和在
AndroidManifest中設置一樣的,當前方向和設置的方向不一致的時候,會重啟activity,一致的話不會重啟;
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//橫屏設置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏設置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默認設置
注意點:
不想activity被重啟,可以在AndroidManifest中加上android:configChanges(orientation|screenSize這兩個一定要加上)
- <activity
- android:name=".MainActivity"
- android:screenOrientation="sensor"
- android:configChanges="keyboardHidden|orientation|screenSize">
3、監聽屏幕旋轉變化
重寫onConfigurationChanged方法
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- Log.d(TAG, "onConfigurationChanged");
- }
這個方法將會在屏幕旋轉變化時調用,可以在這里做出我們在屏幕變化時想要的操作,并且不會重啟activity。但它只能一次旋轉90度,如果一下子旋轉180度,onConfigurationChanged函數不會被調用;
4、自定義旋轉監聽設置
想更加完美,更加完全的掌控監聽屏幕旋轉變化,就的自定義旋轉監聽
(1)創建一個類繼承OrientationEventListener
(2)開啟和關閉監聽
可以在 activity 中創建MyOrientationDetector 類的對象,注意,監聽的開啟的關閉,是由該類的父類的 enable() 和 disable() 方法實現的;
因此,可以在activity的 onResume() 中調用MyOrientationDetector 對象的 enable方法,在 onPause() 中調用MyOrientationDetector 對象的 disable方法來完車功能;
(3)監測指定的屏幕旋轉角度
MyOrientationDetector類的onOrientationChanged 參數orientation是一個從0~359的變量,如果只希望處理四個方向,加一個判斷即可:
- OrientationEventListener mOrientationListener;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mOrientationListener = new OrientationEventListener(this,
- SensorManager.SENSOR_DELAY_NORMAL) {
- @Override
- public void onOrientationChanged(int orientation) {
- if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
- return; //手機平放時,檢測不到有效的角度
- }
- //只檢測是否有四個角度的改變
- if (orientation > 350 || orientation < 10) { //0度
- orientation = 0;
- } else if (orientation > 80 && orientation < 100) { //90度
- orientation = 90;
- } else if (orientation > 170 && orientation < 190) { //180度
- orientation = 180;
- } else if (orientation > 260 && orientation < 280) { //270度
- orientation = 270;
- } else {
- return;
- }
- Log.v(DEBUG_TAG,"Orientation changed to " + orientation);
- }
- };
- if (mOrientationListener.canDetectOrientation()) {
- Log.v(DEBUG_TAG, "Can detect orientation");
- mOrientationListener.enable();
- } else {
- Log.v(DEBUG_TAG, "Cannot detect orientation");
- mOrientationListener.disable();
- }
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mOrientationListener.disable();
- }
總結
快年底了,很多人都要找工作或者寫畢業設計,有不懂就發私信給我,或許可以給你點幫助建議;
我們一起努力進步;