【Android遊戲開發之九】(細節處理)觸屏事件中的Bug解決方案以及禁止橫屏和豎屏切換!

 李華明Himi 原創,轉載務必在明顯處註明:
轉載自 【黑米GameDev街區】 原文連接:  http://www.himigame.com/android-game/315.html

 

 

不少童鞋說個人代碼運行後,點擊home或者back後會程序異常,若是你也這樣遇到過,那麼你確定沒有仔細讀完Himi的博文,第十九篇Himi專門寫了關於這些錯誤的緣由和解決方法,這裏我在博客都補充說明下,省的童鞋們總疑惑這一塊;請點擊下面聯繫進入閱讀:css

【Android遊戲開發十九】(必看篇)SurfaceView運行機制詳解—剖析Back與Home按鍵及切入後臺等異常處理!html


     咱們先講解在觸屏事件處理中咱們須要改進的bug!而後再給出如何禁止橫屏和豎屏切換!以及切換的過程在android os 中是怎樣的。java

先看一段代碼:android

 

 

@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.v("test", "onTouchEvent");
		bmp_y++;
		if (event.getAction() == MotionEvent.ACTION_MOVE) {
			Log.v("Himi", "ACTION_MOVE");
		} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
			Log.v("Himi", "ACTION_DOWN");
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			Log.v("Himi", "ACTION_UP");
		}
		return true;
		//return super.onTouchEvent(event);//備註1
	}
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		Log.v("test", "onKeyDown");
		bmp_x++;
		return super.onKeyDown(keyCode, event);
	}
 

 

 代碼很簡單,一個是處理實體按鍵的響應時間,另外一個是觸屏的響應事件、那麼這裏要說的有兩點:app

第一點:ide

     在surfaceview中咱們的onKeyDown 雖然是重寫了view的函數,可是仍然須要在初始化的時候去聲明獲取焦點,setFocusable(true); 若是不調用此方法,那麼會形成按鍵無效。緣由是由於若是是本身定義一個繼承自View的類,從新實現onKeyDown方法後,只有當該View得到焦點時纔會調用onKeyDown方法,Actvity中的onKeyDown方法是當全部控件均沒有處理該按鍵事件時,纔會調用.函數

 

第二點:this

   也是今天主要須要講得的觸屏響應的函數,onTouchEvent()! 重寫此函數的時候默認最後一句是依照基類的返回方式,return super.onTouchEvent(event); 而後咱們在其中去斷定 MotionEvent.ACTION_MOVE、MotionEvent.ACTION_DOWN、MotionEvent.ACTION_UP 相對應觸屏操做的 拖動、按下、擡起;對此一切都是正確的,可是真正的的運行起項目的時候發現 Log.v("Himi", "ACTION_MOVE"); 這裏log的"ACTION_MOVE",永遠不會執行!!!爲此我找到了解決方法,那麼先解釋下爲何會出現此類狀況。spa

解釋:.net

    onTouchEvent(),預設使用Oeverride這個方法,一般情況下去呼叫super.onTouchEvent()並傳回布林值。可是這裏要注意一點,預設若是去呼叫super.onTouchEvent()則頗有可能super裏面並沒作任何事,而且回傳false回來,一旦回傳false回來,極可能後面的event (例如:Action_Move、Action_Up) 都會收不到了,因此爲了確保保後面event能順利收到,要注意是否要直接呼super.TouchEvent()。


例如:

@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("ConanLog", "Event"+event.getAction());
return super.onTouchEvent(event);
}


這個例子是當你Touch Down的時候會送event進來,接著印出Log,而後呼叫super的onTouchEvent()並回傳佈林值。此時會回傳false,而且以後再也收不到Touch Move或Touch Up的event,為了要確保能收到event,必須要回傳true,因此在這裏要注意一下。

 

這個問題也是當時用到此函數的時候發現的,找了不少資料才找到其解釋、因此之後使用onTouchEvent()函數的時候最後的

 return super.onTouchEvent(event);

必定要改

 return true;

 

最後還要注意一點:在初始化的時候不要忘記setFocusableInTouchMode(true);觸屏模式獲取焦點,比較相似 setFocusable(true);

        ——setFocusable(true);//此方法是用來響應按鍵!若是是本身定義一個繼承自View的類,從新實現onKeyDown方法後,只有當該View得到焦點時纔會調用onKeyDown方法,Actvity中的onKeyDown方法是當全部控件均沒有處理該按鍵事件時,纔會調用.

 

                           

                                                       這裏講下如何禁止橫屏和豎屏切換!

 

在某些遊戲中咱們可能須要禁止橫屏和豎屏切換,其實實現這個要求很簡單,只要在

AndroidManifest.xml 裏面加入這一行 android :screenOrientation="landscape "(landscape 是橫向,portrait 是縱向)。

在android中每次屏幕的切換動會重啓Activity,因此應該在Activity銷燬前保存當前活動的狀態,在Activity再次Create的時候載入配置。在activity加上android:configChanges="keyboardHidden|orientation"屬性,就不會重啓activity.而是去調用onConfigurationChanged(Configuration newConfig). 這樣就能夠在這個方法裏調整顯示方式. 

 

MainActivity中:

 

public void onConfigurationChanged(Configuration newConfig) {
		try {
			super.onConfigurationChanged(newConfig);
			if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
				Log.v("Himi", "onConfigurationChanged_ORIENTATION_LANDSCAPE");
			} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
				Log.v("Himi", "onConfigurationChanged_ORIENTATION_PORTRAIT");
			}
		} catch (Exception ex) {
		}
	}
 

 

AndroidManifest.xml中:

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.himi" android:versionCode="1" android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".MainActivity" android:label="@string/app_name"
			android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
	<uses-sdk android:minSdkVersion="4" />
</manifest>

 

(推薦你們訂閱本博客,由於咱的更新速度但是很快的~娃哈哈)

 

 

 

 


原文連接: http://blog.csdn.net/xiaominghimi/article/details/6104731
相關文章
相關標籤/搜索