本文爲轉載文章
原文鏈接
Android遊戲開發之橫豎屏的切換(二十七)
http://www.apkbus.com/forum.php?mod=viewthread&tid=13443&fromuid=11065
1. 強制橫豎屏
這種方式是最爲簡單並且可以避免因爲切換屏幕導致的一些開發問題,強制屏幕爲橫屏或者豎屏可以用兩種方式來實現, 第一種爲代碼實現、第二種爲配置文件實現,請同學們閱讀下面這段簡單的例子。
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 中設置強制橫屏
<activity android:name=".HandlerActivity" android:screenOrientation="landscape"/>
通過代碼的方式強制爲豎屏
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 中設置強制豎屏
<activity android:name=".HandlerActivity" android:screenOrientation="portrait"/>
2.橫豎屏切換的響應
如果沒有設置強制橫屏或者豎屏那麼每次橫豎屏切換的時候Activity都會被重新創建一次,這樣就會存在一個問題 橫屏後會把圖片拉伸可能在豎屏時感覺很協調的界面切換到橫屏以後會被拉伸的很難看,比較好的解決辦法是爲橫豎屏做兩套圖做兩個佈局文件,這樣子程序中只需要監聽屏幕切換的結果 設置不同的佈局 繪製不同的圖片即可。
AndroidManifest.xml 中設置屬性禁止重新創建Activity,並且添加屏幕切換監聽。
<activity android:name=".HandlerActivity" android:configChanges="orientation|keyboardHidden"/>
設置後屏幕切換後就不會再次調用OnCreate()方法重新創建這個Activity, 切換屏幕之前程序中的一些數據或者內容就不會因爲重新創建Activity導致重置清空。 每當切換橫豎屏的時候系統會自己調用onConfigurationChanged()方法這樣子就可以拿到當前屏幕的橫豎屏狀態,根據狀態就可以做我們想做的事。
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類型的數據,也就是說大量的對象數據的話就要想其它辦法來恢復。
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);
}
}