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的运用。
补充:综合编程 , 其他综合 ,