玩過Android手機的同學們應該都很清楚手機橫豎屏的機制吧,大部分游戲都是無法橫豎屏切換的, 有的游戲只能豎屏的玩,有的游戲只能橫屏玩,為什麼開發中要強制游戲為單一的屏幕呢?原因很簡單 就是因為切換屏幕後帶來的問題過多開發起來過於麻煩所以大多數游戲都會強制橫屏或者豎屏。的今天我用一個小例子帶同學們盤點一下Android開發中橫豎屏切換的一些開發技巧。
1. 強制橫豎屏
這種方式是最為簡單並且可以避免因為切換屏幕導致的一些開發問題,強制屏幕為橫屏或者豎屏可以用兩種方式來實現, 第一種為代碼實現、第二種為配置文件實現,請同學們閱讀下面這段簡單的例子。
Java代碼
- import android.app.Activity;
- import android.content.pm.ActivityInfo;
- import android.os.Bundle;
-
- public class HandlerActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setContentView(R.layout.handler);
- //強制為橫屏
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- super.onCreate(savedInstanceState);
- }
- }
AndroidManifest.xml 中設置強制橫屏
XML/HTML代碼
- <activity android:name=".HandlerActivity" android:screenOrientation="landscape"/>
通過代碼的方式強制為豎屏
Java代碼
- public class HandlerActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setContentView(R.layout.handler);
- //強制為豎屏
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- super.onCreate(savedInstanceState);
- }
- }
AndroidManifest.xml 中設置強制豎屏
XML/HTML代碼
- <activity android:name=".HandlerActivity" android:screenOrientation="portrait"/>
2. 橫豎屏切換的響應
如果沒有設置強制橫屏或者豎屏那麼每次橫豎屏切換的時候Activity都會被重新創建一次,這樣就會存在一個問題 橫屏後會把圖片拉伸可能在豎屏時感覺很協調的界面切換到橫屏以後會被拉伸的很難看,比較好的解決辦法是為橫豎屏做兩套圖做兩個布局文件,這樣子程序中只需要監聽屏幕切換的結果 設置不同的布局 繪制不同的圖片即可。
XML/HTML代碼
- <activity android:name=".HandlerActivity" android:configChanges="orientation¦keyboardHidden"/>
設置後屏幕切換後就不會再次調用OnCreate()方法重新創建這個Activity, 切換屏幕之前程序中的一些數據或者內容就不會因為重新創建Activity導致重置清空。 每當切換橫豎屏的時候系統會自己調用onConfigurationChanged()方法這樣子就可以拿到當前屏幕的橫豎屏狀態,根據狀態就可以做我們想做的事。
Java代碼
- import android.app.Activity;
- import android.content.res.Configuration;
- import android.os.Bundle;
-
- public class HandlerActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setContentView(R.layout.handler);
-
- super.onCreate(savedInstanceState);
- }
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
-
- int type = this.getResources().getConfiguration().orientation;
-
- if (type == Configuration.ORIENTATION_LANDSCAPE) {
- //切換到了橫屏
- } else if (type == Configuration.ORIENTATION_PORTRAIT) {
- //切換到了豎屏
- }
-
- super.onConfigurationChanged(newConfig);
- }
- }
3. 橫豎屏切換數據的保存
如果說項目必需要實現橫豎屏的切換那麼我們就須要對數據進行保存與讀取,這也是為什麼大部分游戲都不支持橫豎屏切換的原因,因為游戲中存在大量的數據 ,比如玩家屬性、坐標點、游戲狀態、人物屬性等等等等實在是太多了。如果要實現正常切換的話那麼這些數據都須要進行保存與記錄,其實相對軟件開發來說做橫豎屏切換的到挺多的,畢竟軟件當前Activity中保存的數據不會有游戲那麼多呵呵,廢話就不多說了我分享一個橫豎屏切換保存數據與讀取數據的方法。
比如橫屏切換豎屏實際上是先把當前的橫屏的Activity殺掉 然後重新創建一個豎屏的Activity,我們可以使用onSaveInstanceState()方法保存數據,它是在橫屏Activity將殺死前調用,可以將須要保存的數據放入Bundle封裝在系統中,切換豎屏後這個Activity又重新被創建 這樣可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)方法中來回復之前保存在Bundle中的數據,這樣就可以實現橫豎屏界面切換數據的保存與讀取,當然前提是只能保存Bundle類型的數據,也就是說大量的對象數據的話就要想其它辦法來恢復。
AndroidManifest.xml 中設置屬性禁止重新創建Activity,並且添加屏幕切換監聽。
Java代碼
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
-
- public class HandlerActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setContentView(R.layout.handler);
-
- super.onCreate(savedInstanceState);
- }
-
- /**切換屏幕之前將數據保存在Bundle中**/
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- long outTime = System.currentTimeMillis();
- //屏幕切換將當前的時候保存在Bundle中
- outState.putLong("time", outTime);
- Log.v("InstanceState", "outTime is "+ outTime);
- super.onSaveInstanceState(outState);
- }
-
- /**切換屏幕之後在Bundle中把數據取出來**/
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- //取出屏幕切換前保存的時間
- Long saveTime = savedInstanceState.getLong("time");
-
- Log.v("InstanceState", "saveTime is "+ saveTime);
- super.onRestoreInstanceState(savedInstanceState);
- }
-
- }
看一下效果圖紅框內的Log信息,outTime 為很橫豎切換屏幕之前保存的當前時間,SaveTime為橫豎切換屏幕之後讀取到之前保存的時間。通過這種方法可以正常的保存與讀取數據。