当前位置:编程学习 > 网站相关 >>

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的运用。
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,