這篇文章給大家介紹怎么在android中利用Activity進行橫豎屏切換,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機版的企業(yè)網(wǎng)站。實現(xiàn)跨屏營銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營銷需求!創(chuàng)新互聯(lián)具備承接各種類型的網(wǎng)站設(shè)計制作、成都做網(wǎng)站項目的能力。經(jīng)過十年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評。
設(shè)置屏幕的方向
簡介
值 | 描述 |
---|---|
unspecified | 默認(rèn)值。系統(tǒng)自動選擇屏幕方向 |
behind | 跟activity堆棧中的下面一個activity的方向一致 |
landscape | 橫屏方向,顯示的寬比高長 |
portrait | 豎屏方向,顯示的高比寬長 |
sensor | 由設(shè)備的物理方向傳感器決定,如果用戶旋轉(zhuǎn)設(shè)備,這屏幕就會橫豎屏切換 |
nosensor | 忽略物理方向傳感器,這樣就不會隨著用戶旋轉(zhuǎn)設(shè)備而橫豎屏切換了("unspecified"設(shè)置除外) |
user | 用戶當(dāng)前首選的方向 |
reverseLandscape | API 9 以上,反向橫屏 |
reversePortrait | API 9 以上,反向豎屏 |
sensorLandscape | API 9 以上,橫屏,但是可以根據(jù) 物理方向傳感器來切換正反向橫屏 |
sensorPortrait | API 9 以上,豎屏,但是可以根據(jù) 物理方向傳感器來切換正反向豎屏 |
fullSensor | API 9 以上,上下左右四個方向,由物理方向傳感器決定 |
locked | API 18 以上,鎖死當(dāng)前屏幕的方向 |
第一種
我們可以在AndroidManifest 清單文件里面制定Activity的方向
這樣橫豎屏切換的時候不會重新創(chuàng)建Activity
第二種
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Android:android:configChanges
如果我們不配置configuration ,當(dāng) configuration 發(fā)生變化的時候,activity會自動處理它。反之,如果我們配置了相應(yīng)的 configuration,當(dāng)新的 configuration 發(fā)生變化的時候,會回調(diào) Activity 的 onConfigurationChanged() 方法。
下面我們一起來看一下幾個常用的值得介紹,其他不常用的hi請自行查閱文檔。官網(wǎng)地址:
值 | 描述 |
---|---|
keyboardHidden | 鍵盤的可訪問性發(fā)生變化——例如:用戶發(fā)現(xiàn)了硬件鍵盤。 |
orientation | 屏幕方向發(fā)生變化——用戶旋轉(zhuǎn)了屏幕。注意:如果應(yīng)用程序的目標(biāo)API級別是13或更高(通過屬性minSdkVersion和屬性targetSdkVersion聲明),你也需要聲明配置項screenSize,因為這將在設(shè)備選擇肖像和屏幕方向時發(fā)生改變。 |
screenLayout | 屏幕布局發(fā)生變化——這個會導(dǎo)致顯示不同的Activity。屏幕方向發(fā)生變化——用戶旋轉(zhuǎn)了屏幕。注意:如果應(yīng)用程序的目標(biāo)API級別是13或更高(通過屬性minSdkVersion和屬性targetSdkVersion聲明),你也需要聲明配置項screenSize,因為這將在設(shè)備選擇肖像和屏幕方向時發(fā)生改變。 |
screenSize | 當(dāng)前可用屏幕大小發(fā)生變化。這代表一個當(dāng)前可用大小的變化,和當(dāng)前的比率相關(guān),因此當(dāng)用戶選擇不同的畫面和圖像,會發(fā)生變化。然而,如果你的程序目標(biāo)API級別是12或更低,你的Activity總是會自己處理這個配置變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的設(shè)備上)。在API級別13里加入的。 |
android:configChanges 常用配置
在Android 3.2以后,如果我們進行下列的配置 ,這樣的話橫豎屏不會重新創(chuàng)建Activity,但是會調(diào)用 onConfigurationChanged()方法
在api 3.2 以前,我們只需這樣配置即可,android:configChanges="keyboardHidden|orientation"。
小結(jié)
當(dāng)我們進行了上述的配置,
豎屏 》 橫屏 onConfigurationChanged()方法會調(diào)用一次
橫屏 》 豎屏 onConfigurationChanged()方法也會調(diào)用一次
因此我們通??梢赃M行相應(yīng)的處理
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // 加入橫屏要處理的代碼 } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // 加入豎屏要處理的代碼 } }
如果我們同時設(shè)置了 android:configChanges="keyboardHidden|orientation|screenSize" 和 android:screenOrientation="portrait",那又會是怎樣的呢?
如果我們打開系統(tǒng)的自動旋轉(zhuǎn)屏幕,旋轉(zhuǎn)屏幕,系統(tǒng)不會發(fā)生變化,也不會調(diào)用 Activity 的 onConfigurationChanged 方法。
當(dāng)我們手動調(diào)用 setRequestedOrientation() 方法去改變屏幕的方向的時候,還是會調(diào)用 onConfigurationChanged 方法的
擴展
設(shè)置全屏模式
// 去掉ActionBar requestWindowFeature(Window.FEATURE_NO_TITLE); // 設(shè)置全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
在實際項目中,我們通常會固定我們應(yīng)用的屏幕方向,只對一些特定的需要切換屏幕的Activity做處理,那我們?nèi)绾谓y(tǒng)一設(shè)置屏幕的方向呢?
第一種方法,復(fù)制張貼,在AndroidManifest清單文件里面的每一個Activity標(biāo)簽增加如下標(biāo)簽。
第二種方法,剛開始我直接在 AppTheme 里面 設(shè)置 android:screenOrientation,但是沒有效果,剛開始我也很納悶,后面查閱了官網(wǎng)文檔,描述如下,才解決了疑問.
Specify the orientation an activity should be run in. If not specified, it will run in the current preferred orientation of the screen. This attribute is supported by the
即這種方法不可取
第三種方法,在BaseActivity里面動態(tài)設(shè)置
public class BaseActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } }
同時列出這三種方法,最主要的目的不是為了告訴大家有這幾種方法可以統(tǒng)一設(shè)置屏幕的方向,最重要的是告訴大家一種思想吧。通常在xml 文件可以設(shè)置的,在java 代碼也可以設(shè)置。
利用系統(tǒng)的加載機制自動幫我們加載相應(yīng)的布局
如果大家在資源目錄res 中添加了 layout-land(橫向布局文件夾) 和 layout-port (豎想布局文件夾),重啟Activity模式的橫豎屏切換,
可能有人會有這樣的疑問,當(dāng)我們設(shè)置了Activity的方向為豎屏或者橫屏的時候,旋轉(zhuǎn)屏幕并不會重新調(diào)用Activity的各個生命周期,那我們要怎樣檢測呢?
其實很簡單,那就是利用我們的傳感器,然后根據(jù)旋轉(zhuǎn)的方向做相應(yīng)的處理
//注冊重力感應(yīng)器 屏幕旋轉(zhuǎn) mSm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSm.registerListener(mOrientationSensorListener, mSensor, SensorManager.SENSOR_DELAY_UI);
public class OrientationSensorListener implements SensorEventListener { private static final int _DATA_X = 0; private static final int _DATA_Y = 1; private static final int _DATA_Z = 2; public static final int ORIENTATION_UNKNOWN = -1; private boolean sensor_flag = true; public static final String TAG = "xujun"; int mLastAngle=-1; AngleChangleListener mAngleChangleListener; public OrientationSensorListener(AngleChangleListener angleChangleListener){ mAngleChangleListener=angleChangleListener; } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { float[] values = event.values; int orientation = ORIENTATION_UNKNOWN; float X = -values[_DATA_X]; float Y = -values[_DATA_Y]; float Z = -values[_DATA_Z]; /** * 這一段據(jù)說是 android源碼里面拿出來的計算 屏幕旋轉(zhuǎn)的 不懂 先留著 萬一以后懂了呢 */ float magnitude = X * X + Y * Y; // Don't trust the angle if the magnitude is small compared to the y value if (magnitude * 4 >= Z * Z) { //屏幕旋轉(zhuǎn)時 float OneEightyOverPi = 57.29577957855f; float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi; orientation = 90 - (int) Math.round(angle); // normalize to 0 - 359 range while (orientation >= 360) { orientation -= 360; } while (orientation < 0) { orientation += 360; } } if (orientation > 225 && orientation < 315) { //橫屏 sensor_flag = false; } else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) { //豎屏 sensor_flag = true; } // Log.i(TAG, "onSensorChanged: orientation=" + orientation+" mLastAngle="+mLastAngle); if(mLastAngle!=orientation && mAngleChangleListener!=null){ mAngleChangleListener.onChange(orientation); mLastAngle=orientation; } } }
設(shè)備旋轉(zhuǎn)時保存Activity的交互狀態(tài)
大家先看一下Activity的生命周期,我們知道如果我們不配置Activity的方向或者Activity的 android:configchang 屬性的時候,每次旋轉(zhuǎn)屏幕,Activity都會重新被創(chuàng)建出來。那我們要如何保存我們當(dāng)前的狀態(tài)呢。
其實我們可以考慮在 onPause() 或者在 onStop() 里面保存我們相應(yīng)的數(shù)據(jù),再在onCreate() 方法里面判斷 savedInstanceState 是否有緩存我們的數(shù)據(jù)即可。 至于選擇在onPause() 還是 onStop() 保存數(shù)據(jù),得看具體的需求分析。 onPause() 在界面失去焦點的時候會回調(diào), onStop() 方法在界面完全不可見的時候會回調(diào)。
private static final String KEY_INDEX = "index"; private int mCurrentIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0); } } @Override protected void onPause(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(KEY_INDEX, mCurrentIndex); }
關(guān)于怎么在android中利用Activity進行橫豎屏切換就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。