初台Android手機己采用『單點』触摸, 直至Android2.0(SDK version 5) 先支持『多點』触摸.
- Android觸摸監聽『OnTouchListener』 監聽 『触屏』事件.
static class TounchListener implements OnTouchListener{ |
- 通過『onTouch()』獲取『触屏』信息.
@Override
public boolean onTouch(View v, MotionEvent event) { |
- 0(ÉCLAIR)(API 5) 先支持多點触摸
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) |
- 處理『多點』触摸
MultiTouch(v, event); else |
- 處理『單點』触摸
- 返回false, 繼續處理觸摸事件.
- 生成觸摸監聽
private static TounchListener Tounch_Listener = new TounchListener() ; |
- 為OpenGL View注冊触摸监听,
view.setOnTouchListener(Tounch_Listener); |
- 通過OnTouch()(View v, MotionEvent event) 獲取『触屏』坐標 . 『触屏』原點(0,0) 係左上角, 單位象素
MotionEvent.getX() |
X軸指右 |
MotionEvent.getY() |
Y軸指下 |
- 獲取『触屏』事件類型 . MotionEvent.getAction()
MotionEvent.getAction() |
|
MotionEvent.ACTION_DOWN |
手指撳屏 |
MotionEvent.ACTION_POINTER_DOWN |
手指撳屏 |
MotionEvent.ACTION_UP |
手指鬆离 |
MotionEvent.ACTION_POINTER_UP |
手指鬆离 |
MotionEvent.ACTION_CANCEL |
手勢鬆 |
MotionEvent.ACTION_MOVE |
移動手指 |
- 『触屏』類型簡化為『撳』『鬆』『拖』三類
public static int ACTION_UP = 1; |
鬆 |
public static int ACTION_DOWN = 2; |
撳 |
public static int ACTION_DRAGGED = 3; |
拖 |
處理『單點』触摸
static void SingleTouch(View v, MotionEvent event){ |
- 提取『触屏』事件類型
int action = event.getAction() & MotionEvent.ACTION_MASK; |
- 處理『撳』類型
if(action == MotionEvent.ACTION_DOWN ||
action == MotionEvent.ACTION_POINTER_DOWN) |
Lib.setTouch(ACTION_DOWN,event.getX(),event.getY());else |
- 處理『撳』類型
if(action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_POINTER_UP ||
action == MotionEvent.ACTION_CANCEL) |
Lib.setTouch(ACTION_UP,event.getX(),event.getY());else |
- 處理『拖』類型
if(action == MotionEvent.ACTION_MOVE) |
Lib.setTouch(ACTION_DRAGGED,event.getX(),event.getY());} |
處理『多點』触摸
- 處理多手指触摸, 提取触摸事件索引
int Pointer_Index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT; |
- 通過触摸事件索引,『触屏』原點(0,0) 係左上角, 單位象素
MotionEvent.getX(index) |
X軸指右 |
MotionEvent.getY(index) |
Y軸指下 |
- 提取『触屏』事件類型
int action = event.getAction() & MotionEvent.ACTION_MASK; |
- 處理多手指触摸, 提取触摸事件索引
int Pointer_Index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT; |
- 提取觸摸事件量
int Pointer_Count = event.getPointerCount(); |
- 遍歷冚觸摸事件
for(int i=0; i< Pointer_Count; ++i) { |
- 跳過冇關觸摸事件
if (action != MotionEvent.ACTION_MOVE && i != Pointer_Index)
continue; |
- 處理『撳』類型
if(action == MotionEvent.ACTION_DOWN ||
action == MotionEvent.ACTION_POINTER_DOWN) |
Lib.setTouch(ACTION_DOWN,event.getX(i),event.getY(i));else |
- 處理『撳』類型
if(action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_POINTER_UP ||
action == MotionEvent.ACTION_CANCEL) |
Lib.setTouch(ACTION_UP,event.getX(i),event.getY(i));else |
- 處理『拖』類型
if(action == MotionEvent.ACTION_MOVE) |
Lib.setTouch(ACTION_DRAGGED,event.getX(i),event.getY(i));} |
係C++緩存『触屏』信息Lib.setTouch();
typedef struct TOUCH_STR{ |
|
int action; |
触屏類型 |
int x,y; |
触屏坐標 |
}TOUCH,*TOUCH_PTR; |
|
『触屏座標』轉『熒屏座標』
void TouchToScreen(CAMERA2D_PTR cam,VECTOR2D_PTR touch){ |
touch->x = (touch->x / (float)cam->real_width) * cam->frustum_width * cam->zoom; |
touch->y = (1-touch->y /(float)cam->real_height) * cam->frustum_height * cam->zoom; } |