当前位置: 代码迷 >> 综合 >> Cosmos 如何实现多点触摸手势识别
  详细解决方案

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

热度:85   发布时间:2024-01-19 20:25:42.0
以下为一个简单的放大缩小的手势识别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的运用。