Android Studio NDK-触摸onTouch()

Android Studio NDK-触摸onTouch()
Android Studio NDK-触摸onTouch()

初台Android手機己采用『單點』触摸, 直至Android2.0(SDK version 5) 先支持『多點』触摸.

  1. Android觸摸監聽『OnTouchListener』 監聽 『触屏』事件.
static class TounchListener implements OnTouchListener{
  1. 通過『onTouch()』獲取『触屏』信息.
@Override

public boolean onTouch(View v, MotionEvent event) {

  1. 0(ÉCLAIR)(API 5) 先支持多點触摸
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR)
  1. 處理『多點』触摸
MultiTouch(v, event); else
  1. 處理『單點』触摸
SingleTouch(v, event);
  1. 返回false, 繼續處理觸摸事件.
return false;}

 

  1. 生成觸摸監聽
private static TounchListener Tounch_Listener  = new TounchListener() ;
  1. 為OpenGL View注冊触摸监听,
view.setOnTouchListener(Tounch_Listener);
  1. 通過OnTouch()(View v, MotionEvent event) 獲取『触屏』坐標 . 『触屏』原點(0,0) 係左上角, 單位象素
MotionEvent.getX() X軸指右
MotionEvent.getY() Y軸指下
  1. 獲取『触屏』事件類型 . MotionEvent.getAction()
MotionEvent.getAction()  
MotionEvent.ACTION_DOWN 手指撳屏
MotionEvent.ACTION_POINTER_DOWN 手指撳屏
MotionEvent.ACTION_UP 手指鬆离
MotionEvent.ACTION_POINTER_UP 手指鬆离
MotionEvent.ACTION_CANCEL 手勢鬆
MotionEvent.ACTION_MOVE 移動手指
  1. 『触屏』類型簡化為『撳』『鬆』『拖』三類
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){
  1. 提取『触屏』事件類型
int action = event.getAction() & MotionEvent.ACTION_MASK;
  1. 處理『撳』類型
if(action == MotionEvent.ACTION_DOWN ||

action == MotionEvent.ACTION_POINTER_DOWN)

        Lib.setTouch(ACTION_DOWN,event.getX(),event.getY());else
  1. 處理『撳』類型
if(action == MotionEvent.ACTION_UP ||

action == MotionEvent.ACTION_POINTER_UP ||

action == MotionEvent.ACTION_CANCEL)

        Lib.setTouch(ACTION_UP,event.getX(),event.getY());else
  1. 處理『拖』類型
if(action == MotionEvent.ACTION_MOVE)
Lib.setTouch(ACTION_DRAGGED,event.getX(),event.getY());}

 

 

處理『多點』触摸

  1. 處理多手指触摸, 提取触摸事件索引
int Pointer_Index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT;
  1. 通過触摸事件索引,『触屏』原點(0,0) 係左上角, 單位象素
MotionEvent.getX(index) X軸指右
MotionEvent.getY(index) Y軸指下
  1. 提取『触屏』事件類型
int action = event.getAction() & MotionEvent.ACTION_MASK;
  1. 處理多手指触摸, 提取触摸事件索引
int Pointer_Index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT;
  1. 提取觸摸事件量
int Pointer_Count = event.getPointerCount();
  1. 遍歷冚觸摸事件
for(int i=0; i< Pointer_Count; ++i)        {
  1. 跳過冇關觸摸事件
if (action != MotionEvent.ACTION_MOVE && i != Pointer_Index)

continue;

  1. 處理『撳』類型
if(action == MotionEvent.ACTION_DOWN ||

action == MotionEvent.ACTION_POINTER_DOWN)

        Lib.setTouch(ACTION_DOWN,event.getX(i),event.getY(i));else
  1. 處理『撳』類型
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
  1. 處理『拖』類型
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; }

 

評論