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;
}
}