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

來源:互聯網
上載者:User

 

Himi  原創, 歡迎轉載,轉載請在明顯處註明! 謝謝。

原文地址:http://blog.csdn.net/xiaominghimi/archive/2010/12/29/6104731.aspx

 

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

先看一段代碼:

 

 

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

@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); 

    } 

 

 

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

第一點:

     在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()。

 

例如:

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

@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中:

 

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

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中:

 

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

<?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>    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.