Android遊戲之SDK版本

Android遊戲之SDK版本

在AndroidManifest.xml中修改< uses-sdk>以設置APP最低支持Android系統.以及編譯APP之SDK版本.設定Android版本需指定整數值也稱為SDK版本號.編譯版本『targetSdkVersion』應儘量使用最新SDK版本.而最低版本『minSdkVersion』應最量低,讓遊戲在更多Android設備上安裝.但也要避免使用低版SDK從而『不支持某些API』.例如下:

<uses-sdk android:minSdkVersion=”9″ android:targetSdkVersion=”28″ />

獲取當前android系統版本號

int   SDK = Integer.parseInt(android.os.Build.VERSION.SDK);

uses-sdk屬性 簡介
minSdkVersion APP最低支持Android系統
targetSdkVersion 編譯APP之SDK版本

 

Android版本 API Level『SDK版本號』
Android API 28
Android 8.1(Oreo) 27
Android 8.0(Oreo) 26
Android 7.1.1(Nougat) 25
Android 7.0(Nougat) 24
Android 6.0(Marshmallow) 23
Android 5.1(Lollipop) 22
Android 5.0(Lollipop) 21
Android 4.4W(KitKat Wear) 20
Android 4.4(KitKat) 19
Android 4.3(Jelly Bean) 18
Android 4.2(Jelly Bean) 17
Android 4.1(Jelly Bean) 16
Android 4.0.3(IceCreamSandwich) 15
Android 4.0(IceCreamSandwich) 14
Android 3.2(Honeycomb) 13
Android 3.1(Honeycomb) 12
Android 3.0(Honeycomb) 11
Android 2.3.3(Gingerbread) 10
Android 2.3(Gingerbread) 9
Android 2.2(Froyo) 8
Android 2.1(Eclair) 7
Android 2.0.1(Eclair) 6
Android 2.0(Eclair) 5
Android 1.6(Donut) 4
Android 1.5(Cupcake) 3
Android 1.1 2
Android 1.0 1

 

Android遊戲之縱向與橫向

Android遊戲之縱向與橫向

Android特點是每當改變手機旋轉方向時APP方向也隨之改變.『橫向』或『縱向』通過加速計傳感器確定.遊戲方向在設計時便確立.所以根本無需改變遊戲方向.只要指定Activity方向便可鎖定不變.在AndroidManifest.xml中修改<activity>屏幕方向屬性『screenOrientation』

強制屏幕縱向

<activity android:name=”.MainActivity”

android:screenOrientation=”portrait”>

強制屏幕橫向

<activity android:name=”.MainActivity”

android:screenOrientation=”landscape”>

在運行時更改屏幕為橫向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

在運行時更改屏幕為縱向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

screenOrientation屏幕方向 簡介
unspecified 默認值,由系統決定
landscape 強制屏幕橫屏顯示
portrait 強制屏幕豎屏顯示
behind 與前一個Activity方向相同
sensor 根據加速計傳感器轉動手機90度、180度、270度. Activity都更著變化
sensorLandscape 屏幕只可橫屏旋轉
sensorPortrait 屏幕只可豎屏旋轉
nosensor 忽略加速計傳感器.旋轉手機不會改變方向
user 用戶當前設置方向

 

Android遊戲之版本控制

Android遊戲之版本控制

Android遊戲發佈到Google Play需要追蹤遊戲『版本』.以便Google Play自動更新遊戲.要設定版本號需編輯 AndroidManifest.xml其根元素<manifest>添加versionCode和versionName屬性

versionCode:版本代碼(整數)大於等於1

versionName:版本名(字符).在Google Play上顯示.建議『versionName= versionCode/100.0f』如『versionCode=”2″』則『versionName=”0.02″』.因為任何遊戲都需要幾十次更新才可達置完善.如下:

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”

package=”net.bookcard.aa”

android:versionCode=”1″

android:versionName=”0.01″>

獲取包管理器

PackageManager  package_manager = context.getPackageManager();

獲取Android應用包名這裡返回『net.bookcard.aa』

package_name = context.getPackageName();

獲取版本信息

PackageInfo package_info = Package_Manager.getPackageInfo(package_name,0);

獲取版本名

String version = Package_Info.versionName;

獲取版本代碼

int code = Package_Info.versionCode;

 

Android遊戲之喚醒鎖

Android遊戲之喚醒鎖

Android最耗電首當觸摸屏.為節約電能很多人都將亮度降低.但又耗神.折中之法是系統自動變暗進入睡眠狀態.觸屏後自動變明亮.如果想屏膜保持喚醒狀態可是WakeLock.但觸屏遊戲是不需WakeLock『喚醒鎖』.它只適用於通過『加速計』控制之遊戲.

首先在AndroidManifest.xml添加權限

<uses-permission android:name=”android.permission.WAKE_LOCK” />

獲取電源管理器

PowerManager power_manager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);

生成喚醒鎖. levelAndFlagsw為控制標記.tag為鎖名

PowerManager.newWakeLock(int levelAndFlags, String tag)

levelAndFlags: 屏幕燈 鍵盤燈
PARTIAL_WAKE_LOCK 關閉 關閉
SCREEN_DIM_WAKE_LOCK 低亮度 關閉
SCREEN_BRIGHT_WAKE_LOCK 高亮度 關閉
FULL_WAKE_LOCK 高亮度 開啟
ON_AFTER_RELEASE 延時關燈 關閉
ACQUIRE_CAUSES_WAKEUP 強制開啟 強制開啟

一般使用PARTIAL_WAKE_LOCK生成喚醒鎖

WakeLock wake_lock = power_manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,”LOCK”);

啟用喚醒鎖.在Activity.onResume()中調用

wake_lock.acquire();

釋放喚醒鎖.在Activity.onPause()中調用

wake_lock.release();

 

Android遊戲之背景音樂

Android遊戲之背景音樂

遊戲聲音分為『音樂』與『音效』.遊戲背景『音樂』播放時間通常達幾分鐘以上.音檔通常較大不能一次性載入記憶體.只能以『數據流』方式逐次讀入數據塊.並解碼為PCM數據交給音頻芯片上.Android系統提供MediaPlayer幫你解卻所有問題. 將所有『音樂』文檔存放在『\app\src\main\assets』目錄下.讓AssetManager能夠訪問.

生成MediaPlayer音頻播放器

MediaPlayer media_player = new MediaPlayer();

獲取ASSET文檔描述符

AssetFileDescriptor afd = asset_manager.openFd(file_name);

文檔描述符

FileDescriptor file_descriptor = afd.getFileDescriptor();

獲取音檔數據開此位置偏移量

long offset = afd.getStartOffset();

獲取音檔數據長度

long length = afd.getLength();

設定音檔數據

media_player.setDataSource(descriptor,offset,length);

每次啟動播放時.都需載入準備播放

media_player.prepare();

啟動播放

media_player.start();

播放中若暫停播放

media_player.pause();

播放中若停止播放

media_player.stop();

設定循環播放.

media_player.setLooping(true);

設定左右聲道音量.數值在0~1之間

media_player.setVolume(volume,volume);

判定時否播放中. isPlaying()若返回true則播放中否則返回false

media_player.isPlaying();

或用註冊OnCompletionListener簡聽器

media_player.setOnCompletionListener(listener);

若退出遊戲需釋放記憶體

media_player.release();

Android遊戲之音效模塊

Android遊戲之音效模塊

遊戲聲音分為『音樂』與『音效』.音效長度不應超過5秒.讓其可以載入『記憶體』中.並將所有音效文檔存放在『\app\src\main\assets』目錄下.讓AssetManager能夠訪問.並將所有『音效』文檔存為『OGG』格式.並且採用低採樣頻率.

Android提供SoundPool『音效池』實現音效載入與播放.

SoundPool(int maxStreams, int streamType, int srcQuality)

maxStreams:用時能播放音效量

streamType:使用音樂流輸出音頻.這裡使用AudioManager.STREAM_MUSIC

srcQuality:廢棄,總為0

構建音效播放

SoundPool sound_pool = new SoundPool(32, AudioManager.STREAM_MUSIC,0);

用於訪問Asset目錄

AssetManager asset_manager = context.getAssets();

獲取資源文檔描述符

AssetFileDescriptor afd = asset_manager.openFd(file_name);

把音效文檔載入『記憶體』中,讓AssetFileDescriptor傳給load()並返回整數ID句柄

int id = sound_pool.load(afd,1);

播放音效

public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

soundID:音效ID句柄

leftVolume\rightVolume:左右聲道音量在0.0f – 1.0f之間

priority:優先級.值越大優先級越高,0優先級最低

loop:循環次數.0代表不循環

rate:播放速率取值0.5f – 2.0f之間.其中0.5f表示播放速度慢一半.1表示正常速率播放.

單次播放音效

sound_pool.play(id, 1.0f, 1.0f, 0, 0, 1);

當不需要音效時,需要釋放音效記憶體

sound_pool.unload(ID);

當退出遊戲時需釋放SoundPool『音效池』

sound_pool.release();

Android Studio之自定遊戲圖標

Android Studio之自定遊戲圖標

Android遊戲都有其icon圖標.而且該圖標也會Google Play上展示.要自定圖標需在遊戲項目『\app\src\main\res\mipmap-xxx』查找icon圖標.然後將其替換.若Eclipse則在drawable目錄下. 並且隨著手機屏幕分辨率不斷進化.遊戲需要提供不同密度圖標『自適應圖標』.圖標分為兩類『圓』與『方』.並且需要在AndroidManifest.xml添加icon圖標屬性.

<application  android:icon=”@mipmap/ic_launcher”

android:roundIcon=”@mipmap/ic_launcher_round”>

Android Studio帶有icon圖標生成器,全自動生成所有不同分辨率圖標.在Eclipse你需要用PS生成.

  1. 項目右擊『New->Image Asset』
  2. Icon Type:選Launcher Icons(Adaptive and Legacy)
  3. Name:填ic_launcher
  4. Asset Type:勾選Image
  5. Path:輸入自定圖標路徑
  6. Trim勾選Yes
  7. Resize拖到100%
  8. Legacy Icon勾選Yes
  9. Gound Icon Generate勾選Yes
  10. Google Play Store Icon勾選Yes
類型 文檔名
方形 ic_launcher.png
圓形 ic_launcher_round.png
前景 ic_launcher_foreground.png
背景 ic_launcher_background.png

 

目錄 簡介 分辨率
mipmap-mdpi 中密度圖標(必須有) 48*48
mipmap-hdpi 高密度圖標 72*72
mipmap-xhdpi 超高密度圖標 96*96
mipmap-xxhdpi 超超高密度圖標 144*144
mipmap-xxxhdpi 超超超高密度圖標 192*192

 

Android遊戲之文檔讀寫

Android遊戲之文檔讀寫

在Android遊戲開發時需要讀入大量Asset(資源).如『3D模型』『紋理』『音頻』『地型』等Asset(資源)文檔.Android建議把資源存放於『res』目錄,但它不適合存放原生資源. 在遊戲開發時使用『assets』目錄,所有遊戲資源文檔存放該目錄下.而且還可以指定目錄結構. 要訪問『assets』目錄需AssetManager資源管理器:

『assets』目錄位於『\app\src\main\assets』這點與Eclipse有所不同.

AssetManager asset_manager = context.getAssets();

打開Asset文檔並返回輸入流InputStream

InputStream input_stream = asset_manager.open(file_name);

讀取『外部緩存』SD卡

Asset只適合用於讀取遊戲資源.若在遊戲運行時讀寫文檔數據.若訪問SD卡需要加入度寫權限:

<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>

<uses-permission android:name=”android.permission.READ_EXTERNAL_STORAGE”/>

然後需要確定手機是否裝有SD卡

獲取『外部緩存』SD卡裝態.其實現在手機載固態硬盤劃出部分空間作為『外部緩存』

String state = Environment.getExternalStorageState();

Environment.MEDIA_MOUNTED:SD卡插入並可正常讀寫

Environment.MEDIA_MOUNTED_READ_ONLY:SD卡已插入,但只能讀取

獲取『外部緩存』路徑

File file_path = Environment.getExternalStorageDirectory();

並不建議在『外部緩存』SD卡讀寫.一SD卡可能被彈出.二可能需要用戶授權.如果數據較小建議寫入『內部存儲』

APP內部存儲緩存目錄『/data/data/< package name >/files/』

File file_path = context.getFilesDir() ;

生成目錄

file_path.mkdir();

連接路徑

File file  = new File(file_path,file_name);

打開文檔並返回輸入流

InputStream input_stream = new FileInputStream(file);

打開文檔並返回輸出流

OutputStream output_stream = new FileOutputStream(file);

獲取指定寫入/讀取路徑 存儲位置
Environment.getExternalStorageDirectory() /mnt/sdcard/
context.getExternalFilesDir() /mnt/sdcard/Android/data/< package name >/files/
context.getExternalCacheDir() /mnt/sdcard/Android/data/< package name >/cach/
context.getFilesDir() /data/data/< package name >/files/
context.getCacheDir() /data/data/< package name >/cach/

 

獲取指定寫入/讀取路徑 簡介
Environment.getExternalStorageDirectory() 外部存儲
context.getExternalFilesDir() 外部存儲
context.getExternalCacheDir() 外部臨時存儲
context.getFilesDir() 內部存儲
context.getCacheDir() 內部臨時緩存

 

Android遊戲之按鍵

Android遊戲之按鍵

Android其實是支持標準鍵盤.大多數Android手機只支持軟鍵盤. 遊戲要捕足按鍵事件你需要實現OnKeyListener接口.它通過與接收鍵盤事件View相連並接收按鍵事件.

public boolean onKey(View view,int keyCode,KeyEvent event);

按鍵編碼keyCode為整數0~127一共128個按鍵.常量值形式為KeyEvent.KEYCODE_XXX

獲取按鍵字符:KeyEvent.getUnicodeChar();

獲取按鍵事件類型: KeyEvent.getAction();

獲取按鍵事件類型: KeyEvent.getAction(); 簡介
KeyEvent.ACTION_MULTIPLE 連續多個重複鍵事件
KeyEvent.ACTION_DOWN 按下按鍵時觸發
KeyEvent.ACTION_UP 鬆開按鍵時觸發

當鍵盤按下時其值被保存在鍵盤列狀態

public static int   MAX_KEY = 128;// 128個按鍵

public static int[] Key_Action  = new int[MAX_KEY];// 按鍵事件,按下/送開

public static int[] Key_Code   = new int[MAX_KEY];// 按鍵代碼

public static int[] Key_Char   = new int[MAX_KEY];// 按鍵字符

public static int  Key_Count  = 0; // 未處理按鍵量

private static boolean[] Key_State = new boolean[128];// 按鍵的當前狀態true按下.false鬆開

private static KeyboardListener Keyboard_Listener = new KeyboardListener();//按鍵監聽器

實現鍵盤監聽接口從View中接收鍵盤事件並處理

static class KeyboardListener implements View.OnKeyListener{

@Override

public boolean onKey(View view, int keyCode, KeyEvent event){

int index;

int Action;

if(Key_Count >= MAX_KEY)

return false;

index = Key_Count;

++Key_Count;

Key_Code[index] = keyCode;// 鍵代碼

Key_Char[index] = event.getUnicodeChar();// 鍵字符

Action = event.getAction();//  獲取按鍵事件類型

if(Action == KeyEvent.ACTION_MULTIPLE)// 多重

return false;

if(Action == KeyEvent.ACTION_DOWN)

{// 按下

if(keyCode >0 && keyCode < 127)

Key_State[keyCode] = true;// 按下

Key_Action[index] = KeyEvent.ACTION_DOWN;

}

else

if(Action == KeyEvent.ACTION_UP)

{// 鬆開

if(keyCode >0 && keyCode < 127)

Key_State[keyCode] = false;

Key_Action[index] = KeyEvent.ACTION_UP;

}

return false;

}

初此按鍵監聽器

public static boolean Init(View view)

{

for(int i=0;i<Key_State.length;++i)

Key_State[i] = false;

view.setOnKeyListener(Keyboard_Listener);// view對按鍵進行監聽

view.requestFocus();//請求焦點

return true;

}

}

電話鍵常量 數值
KEYCODE_CALL 撥號鍵
KEYCODE_ENDCALL 掛機鍵
KEYCODE_HOME Home鍵返回面
KEYCODE_MENU 菜單鍵
KEYCODE_BACK 返回鍵
KEYCODE_SEARCH 搜索鍵
KEYCODE_CAMERA 拍照鍵
KEYCODE_FOCUS 拍照對焦鍵
KEYCODE_POWER 電源鍵
KEYCODE_NOTIFICATION 通知鍵
KEYCODE_MUTE 話筒靜音鍵
KEYCODE_VOLUME_MUTE 揚聲器靜音鍵
KEYCODE_VOLUME_UP 音量增加鍵
KEYCODE_VOLUME_DOWN 音量減小鍵

 

控制鍵常量 數值
KEYCODE_ENTER ENTER回車鍵
KEYCODE_ESCAPE ESC鍵
KEYCODE_DPAD_CENTER 方向鍵/確定鍵
KEYCODE_DPAD_UP 方向鍵/向上鍵
KEYCODE_DPAD_DOWN 方向鍵/向下鍵
KEYCODE_DPAD_LEFT 方向鍵/向左鍵
KEYCODE_DPAD_RIGHT 方向鍵/向右鍵
KEYCODE_MOVE_HOME 光標移動到開始鍵
KEYCODE_MOVE_END 光標移動到末尾鍵
KEYCODE_PAGE_UP 向上翻頁鍵
KEYCODE_PAGE_DOWN 向下翻頁鍵
KEYCODE_DEL 退格鍵
KEYCODE_FORWARD_DEL 刪除鍵
KEYCODE_INSERT 插入鍵
KEYCODE_TAB Tab鍵/焦點切換鍵
KEYCODE_NUM_LOCK 小鍵盤鎖
KEYCODE_CAPS_LOCK 大寫鎖定鍵
KEYCODE_BREAK Break/Pause鍵
KEYCODE_SCROLL_LOCK 滾動鎖定鍵
KEYCODE_ZOOM_IN 放大鍵
KEYCODE_ZOOM_OUT 縮小鍵

 

組合鍵常量 簡介
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right

 

數字與字母鍵常量 簡介
KEYCODE_0 數字鍵0
KEYCODE_1 數字鍵1
KEYCODE_2 數字鍵2
KEYCODE_3 數字鍵3
KEYCODE_4 數字鍵4
KEYCODE_5 數字鍵5
KEYCODE_6 數字鍵6
KEYCODE_7 數字鍵7
KEYCODE_8 數字鍵8
KEYCODE_9 數字鍵9
KEYCODE_A 字母鍵A
KEYCODE_B 字母鍵B
KEYCODE_C 字母鍵C
KEYCODE_D 字母鍵D
KEYCODE_E 字母鍵E
KEYCODE_F 字母鍵F
KEYCODE_G 字母鍵G
KEYCODE_H 字母鍵H
KEYCODE_I 字母鍵I
KEYCODE_J 字母鍵J
KEYCODE_K 字母鍵K
KEYCODE_L 字母鍵L
KEYCODE_M 字母鍵M
KEYCODE_N 字母鍵N
KEYCODE_O 字母鍵O
KEYCODE_P 字母鍵P
KEYCODE_Q 字母鍵Q
KEYCODE_R 字母鍵R
KEYCODE_S 字母鍵S
KEYCODE_T 字母鍵T
KEYCODE_U 字母鍵U
KEYCODE_V 字母鍵V
KEYCODE_W 字母鍵W
KEYCODE_X 字母鍵X
KEYCODE_Y 字母鍵Y
KEYCODE_Z 字母鍵Z

 

符號鍵常量 簡介
KEYCODE_PLUS 加號+
KEYCODE_MINUS 減號-
KEYCODE_STAR 乘號*
KEYCODE_SLASH 除號/
KEYCODE_EQUALS 等號=
KEYCODE_AT 符號鍵@
KEYCODE_POUND 井號鍵#
KEYCODE_APOSTROPHE 單引號’
KEYCODE_BACKSLASH 斜杆\
KEYCODE_COMMA 逗號,
KEYCODE_PERIOD 句號.
KEYCODE_LEFT_BRACKET 左括號[
KEYCODE_RIGHT_BRACKET 右括號]
KEYCODE_SEMICOLON 分號;
KEYCODE_GRAVE `
KEYCODE_SPACE 空格鍵

 

小鍵盤常量 簡介
KEYCODE_NUMPAD_0 小鍵盤數字鍵0
KEYCODE_NUMPAD_1 小鍵盤數字鍵1
KEYCODE_NUMPAD_2 小鍵盤數字鍵2
KEYCODE_NUMPAD_3 小鍵盤數字鍵3
KEYCODE_NUMPAD_4 小鍵盤數字鍵4
KEYCODE_NUMPAD_5 小鍵盤數字鍵5
KEYCODE_NUMPAD_6 小鍵盤數字鍵6
KEYCODE_NUMPAD_7 小鍵盤數字鍵7
KEYCODE_NUMPAD_8 小鍵盤數字鍵8
KEYCODE_NUMPAD_9 小鍵盤數字鍵9
KEYCODE_NUMPAD_ADD 小鍵盤加號+
KEYCODE_NUMPAD_SUBTRACT 小鍵盤減號-
KEYCODE_NUMPAD_MULTIPLY 小鍵盤乘號*
KEYCODE_NUMPAD_DIVIDE 小鍵盤除號’/’
KEYCODE_NUMPAD_EQUALS 小鍵盤等號’=’
KEYCODE_NUMPAD_COMMA 小鍵盤逗號’,’
KEYCODE_NUMPAD_DOT 小鍵盤點號’.’
KEYCODE_NUMPAD_LEFT_PAREN 小鍵盤左括弧'(‘
KEYCODE_NUMPAD_RIGHT_PAREN 小鍵盤左括弧’)’
KEYCODE_NUMPAD_ENTER 小鍵盤回車鍵

 

功能鍵常量 簡介
KEYCODE_F1 按鍵F1
KEYCODE_F2 按鍵F2
KEYCODE_F3 按鍵F3
KEYCODE_F4 按鍵F4
KEYCODE_F5 按鍵F5
KEYCODE_F6 按鍵F6
KEYCODE_F7 按鍵F7
KEYCODE_F8 按鍵F8
KEYCODE_F9 按鍵F9
KEYCODE_F10 按鍵F10
KEYCODE_F11 按鍵F11
KEYCODE_F12 按鍵F12

 

多媒體鍵常量 簡介
KEYCODE_MEDIA_PLAY 播放鍵
KEYCODE_MEDIA_STOP 停止鍵
KEYCODE_MEDIA_PAUSE 暫停鍵
KEYCODE_MEDIA_PLAY_PAUSE 播放/暫停鍵
KEYCODE_MEDIA_FAST_FORWARD 快進鍵
KEYCODE_MEDIA_REWIND 快退鍵
KEYCODE_MEDIA_NEXT 下一首鍵
KEYCODE_MEDIA_PREVIOUS 上一首鍵
KEYCODE_MEDIA_CLOSE 關閉鍵
KEYCODE_MEDIA_EJECT 彈出鍵
KEYCODE_MEDIA_RECORD 錄音鍵

 

通用遊戲手柄按鈕按鍵常量 簡介
KEYCODE_BUTTON_1 #1
KEYCODE_BUTTON_2 #2
KEYCODE_BUTTON_3 #3
KEYCODE_BUTTON_4 #4
KEYCODE_BUTTON_5 #5
KEYCODE_BUTTON_6 #6
KEYCODE_BUTTON_7 #7
KEYCODE_BUTTON_8 #8
KEYCODE_BUTTON_9 #9
KEYCODE_BUTTON_10 #10
KEYCODE_BUTTON_11 #11
KEYCODE_BUTTON_12 #12
KEYCODE_BUTTON_13 #13
KEYCODE_BUTTON_14 #14
KEYCODE_BUTTON_15 #15
KEYCODE_BUTTON_16 #16
KEYCODE_BUTTON_A 手柄A
KEYCODE_BUTTON_B 手柄B
KEYCODE_BUTTON_C 手柄C
KEYCODE_BUTTON_X 手柄X
KEYCODE_BUTTON_Y 手柄 Y
KEYCODE_BUTTON_Z 手柄 Z
KEYCODE_BUTTON_L1 手柄 L1
KEYCODE_BUTTON_L2 手柄L2
KEYCODE_BUTTON_R1 手柄R1
KEYCODE_BUTTON_R2 手柄R2
KEYCODE_BUTTON_MODE 手柄Mode
KEYCODE_BUTTON_SELECT 手柄Select
KEYCODE_BUTTON_START 手柄Start
KEYCODE_BUTTON_THUMBL 左拇指鍵
KEYCODE_BUTTON_THUMBR 右拇指鍵

 

按鍵常量 簡介
KEYCODE_NUM Number modifier
KEYCODE_INFO Info
KEYCODE_APP_SWITCH App switch
KEYCODE_BOOKMARK Bookmark
KEYCODE_AVR_INPUT A/V Receiver input
KEYCODE_AVR_POWER A/V Receiver power
KEYCODE_CAPTIONS Toggle captions
KEYCODE_CHANNEL_DOWN Channel down
KEYCODE_CHANNEL_UP Channel up
KEYCODE_CLEAR Clear
KEYCODE_DVR DVR
KEYCODE_ENVELOPE Envelope special function
KEYCODE_EXPLORER Explorer special function
KEYCODE_FORWARD Forward
KEYCODE_FORWARD_DEL Forward Delete
KEYCODE_FUNCTION Function modifier
KEYCODE_GUIDE Guide
KEYCODE_HEADSETHOOK Headset Hook
KEYCODE_META_LEFT Left Meta modifier
KEYCODE_META_RIGHT Right Meta modifier
KEYCODE_PICTSYMBOLS Picture Symbols modifier
KEYCODE_PROG_BLUE Blue “programmable”
KEYCODE_PROG_GREEN Green “programmable”
KEYCODE_PROG_RED Red “programmable”
KEYCODE_PROG_YELLOW Yellow “programmable”
KEYCODE_SETTINGS Settings
KEYCODE_SOFT_LEFT Soft Left
KEYCODE_SOFT_RIGHT Soft Right
KEYCODE_STB_INPUT Set-top-box input
KEYCODE_STB_POWER Set-top-box power
KEYCODE_SWITCH_CHARSET Switch Charset modifier
KEYCODE_SYM Symbol modifier
KEYCODE_SYSRQ System Request / Print Screen
KEYCODE_TV TV鍵
KEYCODE_TV_INPUT TV input鍵
KEYCODE_TV_POWER TV power鍵
KEYCODE_WINDOW Window鍵
KEYCODE_UNKNOWN 未知按鍵

 

Android遊戲之觸摸屏

Android遊戲之觸摸屏

Android最初就配備有觸摸屏.單只支持單點觸碰.直到Android2.0(SDK 5)才支持多點觸碰.你需要註冊觸摸監聽器OnTouchListener接口,通過onTouch()函式接受觸碰事件並處理.若已處理觸碰事件返回true但後續ACTION_DOWN事件將無法接收.在遊戲中要持續監聽應返回false.而且要分別處理單點觸碰和多點觸碰兩種情況.

static class TounchListener implements View.OnTouchListener {

@Override

public boolean onTouch(View v, MotionEvent event)

{

if(SYSTEM.GetVersion() >= 5)

MultiTouch(v, event);// 多點觸碰

else

SingleTouch(v, event);// 單點觸碰

return false;

}

觸摸監聽器

private static TounchListener Tounch_Listener = new TounchListener();

然後定義三個觸碰事件. 鬆開、按下、拖動.

public static int ACTION_UP    =  1;//  鬆開事件

public static int ACTION_DOWN =   2;// 按下事件

public static int ACTION_DRAGGED = 3;// 拖動事件

定義觸碰點緩存列.

public static int MAX_POINT = 1024;

public static int[] Point_Action = new int[MAX_POINT]; // 事件緩存

public static int[] Point_X    = new int[MAX_POINT];// x座標緩存

public static int[] Point_Y    = new int[MAX_POINT];// y座標緩存

public static int   Point_Count = 0;// 觸碰點量

因為遊戲分辨率與屏幕分辨率並不一至.所以你縮放比變量.

private static float  Scale_X;//  寬度縮放比

private static float  Sacle_Y;//  高度縮放比

初此觸碰模塊.view為Activity.分別輸入『目標分辨率寬與高』和『設備分辨率寬與高』

public static boolean Init(View view,int target_width,int target_height,int real_width,int real_height)

{ // 設置觸摸監聽器

view.setOnTouchListener(Tounch_Listener);

// 計算縮放因子

Scale_X = (float)target_width/(float)real_width;

Sacle_Y = (float)target_height/(float)real_height;

return true;

}

獲取觸摸事件. MotionEvent.getAction()返回觸摸事件

觸摸常量 簡介
ACTION_DOWN 第一隻手指觸屏時觸發
ACTION_POINTER_DOWN 非第一隻手指屏時觸發
ACTION_UP 最後一隻手指離開屏幕時觸發
ACTION_POINTER_UP 非最後一隻手指離開屏幕時觸發
ACTION_CANCEL 手勢取消時觸發
ACTION_MOVE 一隻或多隻手指移動時觸發
ACTION_MASK 提取觸摸事件

MotionEvent.getAction() & MotionEvent.ACTION_MASK

ACTION_POINTER_ID_MASK 提取手指索引

MotionEvent.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINT

處理單點觸碰事件.獲取觸摸座標MotionEvent.getX()返回x軸. MotionEvent.getY()返回y軸.屏幕左上角為座標原點.x軸指向右邊.y軸指向下邊

static void SingleTouch(View v, MotionEvent event)

{

int action;

int index;

action = event.getAction() & MotionEvent.ACTION_MASK;// 提取觸碰事件動作

index = Point_Count; //  索引

Point_Count = Point_Count + 1;// 觸碰量加一

Point_Action[index] = action; //  事件

if(action == MotionEvent.ACTION_DOWN ||

action == MotionEvent.ACTION_POINTER_DOWN)

Point_Action[index] = ACTION_DOWN;// 按下

else

if(action == MotionEvent.ACTION_UP ||

action == MotionEvent.ACTION_POINTER_UP ||

action == MotionEvent.ACTION_CANCEL)

Point_Action[index] = ACTION_UP;// 鬆開

else

if(action == MotionEvent.ACTION_MOVE)

Point_Action[index] = ACTION_DRAGGED;// 拖動

// 計算遊戲屏幕座標

Point_X[index] = (int)(event.getX()*Scale_X);

Point_Y[index] = (int)(event.getY()*Sacle_Y);

}

處理多點觸碰可以通過MotionEvent.getPointerCount()獲知同時有幾隻手指觸碰屏膜.而手指觸碰屏幕都會獲得新索引.索引可以通過getAction()提取:

MotionEvent.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT;

static void MultiTouch(View v, MotionEvent event)

{

int action;

int Point_index;// 點索引

action = event.getAction() & MotionEvent.ACTION_MASK;//  提取觸摸事件

Point_index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT;//手指索引

Point_Count = event.getPointerCount();//  手指觸碰量

for(int index = 0; index< Point_Count ; ++index)

{

if (action != MotionEvent.ACTION_MOVE && index != Point_index)

continue;

if(action == MotionEvent.ACTION_DOWN ||

action == MotionEvent.ACTION_POINTER_DOWN)

Point_Action[index] = ACTION_DOWN;// 按下

else

if(action == MotionEvent.ACTION_UP ||

action == MotionEvent.ACTION_POINTER_UP ||

action == MotionEvent.ACTION_CANCEL)

Point_Action[index] = ACTION_UP;// 鬆開

else

if(action == MotionEvent.ACTION_MOVE)

Point_Action[index] = ACTION_DRAGGED;// 拖動

//讀取指定手指座並計算遊戲屏幕座標

Point_X[index] = (int)(event.getX(index)*Scale_X);

Point_Y[index] = (int)(event.getY(index)*Sacle_Y);

++index;

}

}