成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

屏幕旋轉切換機制詳解

移動開發 Android
默認情況下,當用戶手機的重力感應器打開后,旋轉屏幕方向,會導致當前activity發生onDestroy-> onCreate,這樣會重新構造當前activity和界面布局,如果在Camera界面,則表現為卡頓或者黑屏一段時間。

[[435135]]

前言

屏幕旋轉的機制;

默認情況下,當用戶手機的重力感應器打開后,旋轉屏幕方向,會導致當前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設置;

  1. android:name=".test1" 
  2.  
  3. android:screenOrientation="landscape" /> 
  4.  
  5. android:name=".test2" 
  6.  
  7. android:screenOrientation="portrait" /> 

橫屏或者豎屏是被直接定死,旋轉方向不會變化,只有一個方向(意思是旋轉180°也不會改變),當然就不會在手機旋轉的時候重啟activity;

2、代碼設置

調用setRequestedOrientation()函數,其效果就是和在

AndroidManifest中設置一樣的,當前方向和設置的方向不一致的時候,會重啟activity,一致的話不會重啟;

  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//橫屏設置 
  2.  
  3. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏設置 
  4.  
  5. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默認設置 

注意點:

不想activity被重啟,可以在AndroidManifest中加上android:configChanges(orientation|screenSize這兩個一定要加上)

  1. <activity 
  2.             android:name=".MainActivity" 
  3.             android:screenOrientation="sensor" 
  4.             android:configChanges="keyboardHidden|orientation|screenSize"

3、監聽屏幕旋轉變化

重寫onConfigurationChanged方法

  1. @Override 
  2.  
  3. public void onConfigurationChanged(Configuration newConfig) { 
  4.  
  5. super.onConfigurationChanged(newConfig); 
  6.  
  7. Log.d(TAG, "onConfigurationChanged"); 
  8.  

這個方法將會在屏幕旋轉變化時調用,可以在這里做出我們在屏幕變化時想要的操作,并且不會重啟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的變量,如果只希望處理四個方向,加一個判斷即可:

  1. OrientationEventListener mOrientationListener; 
  2.     @Override 
  3.     public void onCreate(Bundle savedInstanceState) { 
  4.         super.onCreate(savedInstanceState); 
  5.         setContentView(R.layout.main); 
  6.         mOrientationListener = new OrientationEventListener(this, 
  7.             SensorManager.SENSOR_DELAY_NORMAL) { 
  8.             @Override 
  9.             public void onOrientationChanged(int orientation) { 
  10.             if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) { 
  11.     return;  //手機平放時,檢測不到有效的角度 
  12. //只檢測是否有四個角度的改變 
  13. if (orientation > 350 || orientation < 10) { //0度 
  14.     orientation = 0; 
  15. else if (orientation > 80 && orientation < 100) { //90度 
  16.     orientation = 90; 
  17. else if (orientation > 170 && orientation < 190) { //180度 
  18.     orientation = 180; 
  19. else if (orientation > 260 && orientation < 280) { //270度 
  20.     orientation = 270; 
  21. else { 
  22.     return
  23. Log.v(DEBUG_TAG,"Orientation changed to " + orientation); 
  24.             } 
  25.         }; 
  26.        if (mOrientationListener.canDetectOrientation()) { 
  27.            Log.v(DEBUG_TAG, "Can detect orientation"); 
  28.            mOrientationListener.enable(); 
  29.        } else { 
  30.            Log.v(DEBUG_TAG, "Cannot detect orientation"); 
  31.            mOrientationListener.disable(); 
  32.        } 
  33.     } 
  34.     @Override 
  35.     protected void onDestroy() { 
  36.         super.onDestroy(); 
  37.         mOrientationListener.disable(); 
  38.     } 

總結

快年底了,很多人都要找工作或者寫畢業設計,有不懂就發私信給我,或許可以給你點幫助建議;

我們一起努力進步;

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2011-07-07 11:12:57

iPad iPhone

2010-05-25 17:30:36

移動IPv6切換

2019-12-26 13:06:07

Windows 10旋轉屏幕Windows

2023-11-02 09:42:21

iOS屏幕旋轉

2015-09-17 09:42:31

更新Windows RT 微軟

2019-03-29 13:38:51

Windows 10旋轉屏幕

2009-07-08 15:01:00

Servlet Ses

2024-07-16 08:38:06

2021-09-06 18:55:57

MySQLCheckpoint機制

2010-01-26 18:00:07

Android屏幕元素

2009-08-06 17:31:46

C#制作屏幕保護

2009-09-23 16:30:01

Hibernate f

2011-05-26 15:23:34

JavaReflection

2011-03-23 12:58:30

LAMPweb機制

2011-03-17 09:20:05

異常處理機制

2010-08-11 09:40:44

LINQ

2011-03-09 09:11:52

java反射機制

2011-09-27 10:23:24

Java反射機制

2020-04-24 15:44:50

MySQL數據庫鎖機制

2020-04-02 15:10:57

Kubernetes集群安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久久动漫日韩 | 91在线视频免费观看 | 尹人av| 久国产视频 | 成人午夜免费在线视频 | 91最新视频| 日本特黄a级高清免费大片 国产精品久久性 | 国产精品国产成人国产三级 | 亚洲欧美综合精品久久成人 | 日本午夜免费福利视频 | 精品国产一区二区三区性色av | 欧美激情视频一区二区三区免费 | 亚洲综合色 | 99久久精品国产一区二区三区 | 亚洲一区二区在线 | 夜夜爽99久久国产综合精品女不卡 | 国产毛片av | 一级毛片在线视频 | 奇色影视 | 精品欧美一区二区三区久久久 | 国产a区 | 天天干天天操天天看 | 女同久久 | 夜夜骑首页 | 日韩黄色av | 一区二区在线免费观看 | 国产精品视频久久 | 精品久久久久久红码专区 | 久久手机在线视频 | 久久男女视频 | 国产福利精品一区 | 91在线视频免费观看 | 国产成人亚洲精品 | 精精国产xxxx视频在线播放 | 一区二区三区中文字幕 | 九九热在线视频 | 四虎永久在线精品免费一区二 | 亚洲一区二区在线电影 | 九九福利| 国产在线一区二区三区 | 精品欧美黑人一区二区三区 |