Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android游戲 >> Android游戲開發 >> Android游戲開發9:觸屏事件處理中的常見問題及如何禁止橫豎屏切換

Android游戲開發9:觸屏事件處理中的常見問題及如何禁止橫豎屏切換

編輯:Android游戲開發

       本文首先為大家講解觸屏事件處理中的常見問題,也可以說是需要修正的bug,之後介紹如何禁止橫豎屏切換。

       觸屏事件處理的常見問題

       先看一段代碼:

Java代碼
  1. @Override  
  2.     public boolean onTouchEvent(MotionEvent event) {   
  3.         Log.v("test", "onTouchEvent");   
  4.         bmp_y++;   
  5.         if (event.getAction() == MotionEvent.ACTION_MOVE) {   
  6.             Log.v("Himi", "ACTION_MOVE");   
  7.         } else if (event.getAction() == MotionEvent.ACTION_DOWN) {   
  8.             Log.v("Himi", "ACTION_DOWN");   
  9.         } else if (event.getAction() == MotionEvent.ACTION_UP) {   
  10.             Log.v("Himi", "ACTION_UP");   
  11.         }   
  12.         return true;   
  13.         //return super.onTouchEvent(event);//備注1   
  14.     }   
  15.     public boolean onKeyDown(int keyCode, KeyEvent event) {   
  16.         Log.v("test", "onKeyDown");   
  17.         bmp_x++;   
  18.         return super.onKeyDown(keyCode, event);   
  19.     }  

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

       第一點:

       在Surfaceview中我們的onKeyDown 雖然是重寫了view的函數,但是仍然需要在初始化的時候去聲明獲取焦點,setFocusable(true); 如果不調用此方法,那麼會造成按鍵無效。原因是因為如果是自己定義一個繼承自View的類,重新實現onKeyDown方法後,只有當該View獲得焦點時才會調用onKeyDown方法,Actvity中的onKeyDown方法是當所有控件均沒有處理該按鍵事件時,才會調用。

       第二點:

       也是今天主要需要講得的觸屏響應的函數,onTouchEvent()!重寫此函數的時候默認最後一句是依照基類的返回方式,return super.onTouchEvent(event);。然後我們在其中去判定 MotionEvent.ACTION_MOVE、MotionEvent.ACTION_DOWN、MotionEvent.ACTION_UP 相對應觸屏操作的 拖動、按下、抬起;對此一切都是正確的,但是真正的的運行起項目的時候發現 Log.v(“Himi”, “ACTION_MOVE”); 這裡log的”ACTION_MOVE”,永遠不會執行!!!為此我找到了解決方法,那麼先解釋下為什麼會出現此類情況。

       解釋:

       onTouchEvent(),預設使用Oeverride這個方法,通常情況下去呼叫super.onTouchEvent()並傳回布林值。但是這裡要注意一點,預設如果去呼叫super.onTouchEvent()則很有可能super裡面並沒做任何事,並且回傳false回來,一旦回傳false回來,很可能後面的event (例如:Action_Move、Action_Up) 都會收不到了,所以為了確保保後面event能順利收到,要注意是否要直接呼super.TouchEvent()。

Java代碼
  1. @Override  
  2. public boolean onTouchEvent(MotionEvent event) {   
  3. Log.i("ConanLog", "Event"+event.getAction());   
  4. return super.onTouchEvent(event);   
  5. }  

       這個例子是當你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中:

Java代碼
  1. public void onConfigurationChanged(Configuration newConfig) {   
  2.      try {   
  3.          super.onConfigurationChanged(newConfig);   
  4.          if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {   
  5.              Log.v("Himi", "onConfigurationChanged_ORIENTATION_LANDSCAPE");   
  6.          } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {   
  7.              Log.v("Himi", "onConfigurationChanged_ORIENTATION_PORTRAIT");   
  8.          }   
  9.      } catch (Exception ex) {   
  10.      }   
  11. }  

       AndroidManifest.xml中:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.himi" android:versionCode="1" android:versionName="1.0">  
  4.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  5.         <activity android:name=".MainActivity" android:label="@string/app_name"  
  6.             android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation">  
  7.             <intent-filter>  
  8.                 <action android:name="android.intent.action.MAIN" />  
  9.                 <category android:name="android.intent.category.LAUNCHER" />  
  10.             </intent-filter>  
  11.         </activity>  
  12.     </application>  
  13.     <uses-sdk android:minSdkVersion="4" />  
  14. </manifest>  

轉自:http://www.himigame.com/android-game/315.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved