Android遊戲開發之橫豎屏的切換
https://www.apkbus.com/android-13443-1-1.html
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);
-
}
- }
- <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);
-
}
- }
- <activity android:name=".HandlerActivity" android:screenOrientation="portrait"/>
如果沒有設置強製橫屏或者豎屏那麼每次橫豎屏切換的時候Activity都會被重新創建一次,這樣就會存在一個問題 橫屏後會把圖片拉伸可能在豎屏時感覺很協調的界麵切換到橫屏以後會被拉伸的很難看,比較好的解決辦法是為橫豎屏做兩套圖做兩個布局文件,這樣子程序中隻需要監聽屏幕切換的結果 設置不同的布局 繪製不同的圖片即可。
AndroidManifest.xml 中設置屬性禁止重新創建Activity,並且添加屏幕切換監聽。
- <activity android:name=".HandlerActivity" android:configChanges="orientation|keyboardHidden"/>
-
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);
-
}
- }
如果說項目必需要實現橫豎屏的切換那麼我們就須要對數據進行保存與讀取,這也是為什麼大部分遊戲都不支持橫豎屏切換的原因,因為遊戲中存在大量的數據 ,比如玩家屬性、坐標點、遊戲狀態、人物屬性等等等等實在是太多了。如果要實現正常切換的話那麼這些數據都須要進行保存與記錄,其實相對軟件開發來說做橫豎屏切換的到挺多的,畢竟軟件當前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);
-
}
-
- }

Android橫豎屏切換總結
https://www.open-open.com/lib/view/open1328069449468.html
Android橫豎屏要解決的問題應該就兩個:
一.布局問題
二.重新載入問題
1.布局問題:如果不想讓軟件在橫豎屏之間切換,最簡單的辦法就是在項目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有以下幾個參數:
"unspecified":默認值 由係統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向.
"landscape":橫屏顯示(寬比高要長)
"portrait":豎屏顯示(高比寬要長)
"user":用戶當前首選的方向
"behind":和該Activity下麵的那個Activity的方向一致(在Activity堆棧中的)
"sensor":有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
"nosensor":忽略物理感應器,這樣就不會隨著用戶旋轉設備而更改了("unspecified"設置除外)。
也可以在Java代碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)來設置。
如果要讓軟件在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的布局。可以通過以下方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會自動尋找。
2)通過 this.getResources().getConfiguration().orientation來判斷當前是橫屏還是豎屏然後來加載相應的 xml布局文件。因為當屏幕變為橫屏的時候,係統會重新唿叫當前Activity的onCreate方法,你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml.
1
|
if ( this .getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE){
|
2
|
Log.i( "info" , "landscape" ); //
橫屏
|
3
|
}
|
4
|
else if ( this .getResources().getConfiguration().orientation
==Configuration.ORIENTATION_PORTRAIT) {
|
5
|
Log.i( "info" , "portrait" ); //
豎屏
|
6
|
}
|
1
|
//檢測實體鍵盤的狀態:推出或者合上
|
2
|
if (newConfig.hardKeyboardHidden
==Configuration.HARDKEYBOARDHIDDEN_NO){
|
3
|
//實體鍵盤處於推出狀態,在此處添加額外的處理代碼
|
4
|
}
|
5
|
else if (newConfig.hardKeyboardHidden
==Configuration.HARDKEYBOARDHIDDEN_YES){
|
6
|
//實體鍵盤處於合上狀態,在此處添加額外的處理代碼
|
7
|
}
|
2.重新載入問題。如果不需要從新載入,可以在AndroidManifest.xml中加入配置 android:configChanges="orientation|keyboardHidden",配置 android:configChanges的作用就是如文檔所說的:Specify one or more configuration changesthat the activity will handle itself. If not specified, the activity will berestarted if any of these configuration changes happen in the system。這樣在程序中Activity就不會重複的調用onCreate()甚至不會調用onPause、onResume.隻會調用一個 onConfigurationChanged(Configuration newConfig)。如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中保存之前的操作內容或數據,則需要保存之前的數據。然後在 activity的onCreate()中取出來。當然,如此就不能設置android:configChanges()了,否則就不會調用 onCreate()方法。
如果要徹底禁止翻轉,可以設置android:screenOrientation的屬性為nosensor,如此就可以忽略重力感應帶來的麻煩了。不過在模擬器上不管用,在真機上是正確的。android:screenOrientation="portrait"
則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation="landscape",為橫屏顯示。
Android強製設置橫屏或豎屏
https://2960629.blog.51cto.com/2950629/701227
全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);//隱藏標題 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置全屏
橫屏
@Override protected void onResume() { /** * 設置為橫屏 */ if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } super.onResume(); }
android:launchMode="singleTask" android:screenOrientation="portrait">
如果隻是簡單的界麵調整,我們可以阻止此問題的發生,屏幕旋轉而自己調整屏幕的元素重構。
首先我們需要修改AndroidManifest.xml文件:
<activity android:name=".Magazine">
</activity>
//修改為:
<activity android:name=".Magazine"
android:configChanges="orientation|keyboard">
</activity>
這樣是讓程序能夠響應旋轉屏幕的事件。
然後重寫onConfigurationChanged方法:
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
Log.v(" == onConfigurationChanged");
processLayout();
}
<manifest xmlns:androhttps://schemas.android.com/apk/res/android" >https://schemas.android.com/apk/res/android"
package="com.demo"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".DemoGPS"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="com.google.android.maps" />
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
</manifest>
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
{
//land
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
//port
}
}
android:screenOrientation=["unspecified" | "user" | "behind" |screenOrientation 用來指定Activity的在設備上顯示的方向,每個值代表如下含義:
"landscape" | "portrait" |
"sensor" | "nonsensor"]
"unspecified " |
默認值 由係統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向. |
"landscape " |
橫屏顯示(寬比高要長) |
"portrait " |
豎屏顯示(高比寬要長) |
"user " |
用戶當前首選的方向 |
"behind " |
和該Activity下麵的那個Activity的方向一致(在Activity堆棧中的) |
"sensor " |
有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。 |
"nosensor " |
忽略物理感應器,這樣就不會隨著用戶旋轉設備而更改了 ( "unspecified "設置除外
)。 |
Android遊戲和應用開發中強製橫豎屏引起的程序重新啟動問題
https://www.2cto.com/kf/201111/110474.html
最後更新:2017-04-03 18:51:56
上一篇:
最優二叉樹算法
下一篇:
不同線程之間傳遞數據
《數據結構與抽象:Java語言描述(原書第4版)》一P.1 封裝
消息隊列的exclusive consumer功能是如何保證消息有序和防止腦裂的
幫程序員減壓放鬆的10個良心網站
android訪問本地web(不是127.0.0.1而是10.0.2.2)
對HTML標準的思考 - 記解決H5隨機顯示簡繁體漢字問題
TCP詳解(三次握手/四次揮手詳解)
PostgreSQL 從文件係統恢複遺失的UNLOGGED table's datafile.
AVPass技術分析:銀行劫持類病毒鼻祖BankBot再度來襲,如何繞過穀歌play的殺毒引擎?
Oracle命令行登陸導入導出以及連接字符串
Top100論文導讀:深入理解卷積神經網絡CNN(Part Ⅱ)