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;

}

}

評論