0
点赞
收藏
分享

微信扫一扫

Cosmos 如何实现多点触摸手势识别


以下为一个简单的放大缩小的手势识别sample code。在某page页里放了一个frame, 通过multi touch手势放大或者缩小它。 

void VappTestPage::onInit() 

 { 

  /* call base class */ 

  VfxPage::onInit();  

 setBgColor(VFX_COLOR_BLACK); 

  /* 开启multi touch*/ 

  VfxPen *pen = VFX_OBJ_GET_INSTANCE(VfxPen); 

  pen->setTouchMode(VFX_PEN_TOUCH_MODE_MULTI_TOUCH); 

  /* 创建目标frame*/ 

  VFX_OBJ_CREATE(m_focusFrame, VfxFrame, this); 

  m_focusFrame->setAnchor(0.5f, 0.5f); 

  m_focusFrame->setBgColor(VFX_COLOR_RED); 

  m_focusFrame->setPos(LCD_WIDTH/2, LCD_HEIGHT/2); 

  m_focusFrame->setBounds(0, 0, 180, 300); 

  m_focusFrame->setAutoAnimate(VFX_TRUE); 

 } 

 /* 用来放大和缩小目标frame的方法 */ 

 void VappTestPage::scale(VfxFloat param) 

 { 

  VfxTransform trans; 

  if(param <= 0) 

  param = 1; 

  trans.init(VFX_TRANSFORM_TYPE_AFFINE); 

  trans.data.affine.sx = trans.data.affine.sy = param; 

  VfxAutoAnimate::begin(); 

  m_focusFrame->setTransform(trans); 

  VfxAutoAnimate::commit(); 

 } 

 /* 计算两点之间距离的方法 */  

 VfxFloat VappTestPage::calcDistance(VfxPoint pt1, VfxPoint pt2) 

 { 

  VfxU32 distance_x = vfxAbs(pt1.x - pt2.x); 

  VfxU32 distance_y = vfxAbs(pt1.y - pt2.y); 

  return vfxSqrt((VfxFloat)(distance_x * distance_x + distance_y * distance_y)); 

 } 

 /* 重写onPenInput方法,处理pen事件 */ 

 VfxBool VappTestPage::onPenInput(VfxPenEvent &event) 

 { 

  /* 单点触摸的情况不做处理 */ 

  if(event.touchCount == 1) 

  { 

  //Do nothing 

  } 

  else 

  { 

  /* 多点触摸的情形,只采用前两个落下的点做计算 */ 

  if((event.touchEvents[0].type 

  

 == VFX_PEN_EVENT_TYPE_MOVE) && (event.touchEvents[1].type ==

 VFX_PEN_EVENT_TYPE_MOVE)) 

  { 

  VfxFloat distance_downPos = calcDistance(event.touchEvents[0].downPos,

 event.touchEvents[1].downPos); 

  VfxFloat distance_movePos = calcDistance(event.touchEvents[0].pos,

 event.touchEvents[1].pos); 

  if(distance_downPos - distance_movePos > 30) // 30 pixel的阀值可以自行调整 

  { 

  scale(distance_movePos / distance_downPos); 

  } 

  else if(distance_movePos - distance_downPos > 30) 

  { 

  scale(distance_movePos / distance_downPos); 

  } 

  } 

  } 

  return VFX_TRUE; 

 }


另外记住在onDeinit里面设回single touch mode。 
算法可以自行改进或采用其他算法,sample code主要呈现Multi-touch的开启以及event data的运用。

举报

相关推荐

0 条评论