屏幕旋轉(zhuǎn)切換機(jī)制詳解
前言
屏幕旋轉(zhuǎn)的機(jī)制;
默認(rèn)情況下,當(dāng)用戶手機(jī)的重力感應(yīng)器打開(kāi)后,旋轉(zhuǎn)屏幕方向,會(huì)導(dǎo)致當(dāng)前activity發(fā)生onDestroy-> onCreate,這樣會(huì)重新構(gòu)造當(dāng)前activity和界面布局,如果在Camera界面,則表現(xiàn)為卡頓或者黑屏一段時(shí)間;
今天就介紹下平面旋轉(zhuǎn)方面的知識(shí)點(diǎn);
一、screenOrientation屬性說(shuō)明
android:screenOrientation屬性說(shuō)明:
- unspecified,默認(rèn)值,由系統(tǒng)決定,不同手機(jī)可能不一致
- landscape,強(qiáng)制橫屏顯示,只有一個(gè)方向
- portrait,強(qiáng)制豎屏顯,只有一個(gè)方向
- behind,與前一個(gè)activity方向相同
- sensor,根據(jù)物理傳感器方向轉(zhuǎn)動(dòng),用戶90度、180度、270度旋轉(zhuǎn)手機(jī)方向,activity都更著變化,會(huì)重啟activity(無(wú)論系統(tǒng)是否設(shè)置為自動(dòng)轉(zhuǎn)屏,activity頁(yè)面都會(huì)跟隨傳感器而轉(zhuǎn)屏)
- sensorLandscape,橫屏旋轉(zhuǎn),就是可以上下旋轉(zhuǎn),有兩個(gè)方向,不會(huì)重啟activity
- sensorPortrait,豎屏旋轉(zhuǎn),就是可以上下旋轉(zhuǎn),有兩個(gè)方向,不會(huì)重啟activity
- nosensor,旋轉(zhuǎn)設(shè)備時(shí)候,界面不會(huì)跟著旋轉(zhuǎn)。初始化界面方向由系統(tǒng)控制(無(wú)論系統(tǒng)是否設(shè)置為自動(dòng)轉(zhuǎn)屏,activity頁(yè)面都不會(huì)轉(zhuǎn)屏)
- user,用戶當(dāng)前設(shè)置的方向
- reverseLandscape,與正常的橫向方向相反顯示(反向橫屏)
- reversePortrait,與正常的縱向方向相反顯示(反向豎屏)(我設(shè)置沒(méi)用)
二、屏幕旋轉(zhuǎn)詳解
1、配置文件設(shè)置
AndroidManifest.xml設(shè)置;
- android:name=".test1"
- android:screenOrientation="landscape" />
- android:name=".test2"
- android:screenOrientation="portrait" />
橫屏或者豎屏是被直接定死,旋轉(zhuǎn)方向不會(huì)變化,只有一個(gè)方向(意思是旋轉(zhuǎn)180°也不會(huì)改變),當(dāng)然就不會(huì)在手機(jī)旋轉(zhuǎn)的時(shí)候重啟activity;
2、代碼設(shè)置
調(diào)用setRequestedOrientation()函數(shù),其效果就是和在
AndroidManifest中設(shè)置一樣的,當(dāng)前方向和設(shè)置的方向不一致的時(shí)候,會(huì)重啟activity,一致的話不會(huì)重啟;
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//橫屏設(shè)置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏設(shè)置
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默認(rèn)設(shè)置
注意點(diǎn):
不想activity被重啟,可以在AndroidManifest中加上android:configChanges(orientation|screenSize這兩個(gè)一定要加上)
- <activity
- android:name=".MainActivity"
- android:screenOrientation="sensor"
- android:configChanges="keyboardHidden|orientation|screenSize">
3、監(jiān)聽(tīng)屏幕旋轉(zhuǎn)變化
重寫onConfigurationChanged方法
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- Log.d(TAG, "onConfigurationChanged");
- }
這個(gè)方法將會(huì)在屏幕旋轉(zhuǎn)變化時(shí)調(diào)用,可以在這里做出我們?cè)谄聊蛔兓瘯r(shí)想要的操作,并且不會(huì)重啟activity。但它只能一次旋轉(zhuǎn)90度,如果一下子旋轉(zhuǎn)180度,onConfigurationChanged函數(shù)不會(huì)被調(diào)用;
4、自定義旋轉(zhuǎn)監(jiān)聽(tīng)設(shè)置
想更加完美,更加完全的掌控監(jiān)聽(tīng)屏幕旋轉(zhuǎn)變化,就的自定義旋轉(zhuǎn)監(jiān)聽(tīng)
(1)創(chuàng)建一個(gè)類繼承OrientationEventListener
(2)開(kāi)啟和關(guān)閉監(jiān)聽(tīng)
可以在 activity 中創(chuàng)建MyOrientationDetector 類的對(duì)象,注意,監(jiān)聽(tīng)的開(kāi)啟的關(guān)閉,是由該類的父類的 enable() 和 disable() 方法實(shí)現(xiàn)的;
因此,可以在activity的 onResume() 中調(diào)用MyOrientationDetector 對(duì)象的 enable方法,在 onPause() 中調(diào)用MyOrientationDetector 對(duì)象的 disable方法來(lái)完車功能;
(3)監(jiān)測(cè)指定的屏幕旋轉(zhuǎn)角度
MyOrientationDetector類的onOrientationChanged 參數(shù)orientation是一個(gè)從0~359的變量,如果只希望處理四個(gè)方向,加一個(gè)判斷即可:
- 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; //手機(jī)平放時(shí),檢測(cè)不到有效的角度
- }
- //只檢測(cè)是否有四個(gè)角度的改變
- 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();
- }
總結(jié)
快年底了,很多人都要找工作或者寫畢業(yè)設(shè)計(jì),有不懂就發(fā)私信給我,或許可以給你點(diǎn)幫助建議;
我們一起努力進(jìn)步;