最近在做项目发现一个让人很头疼的问题
qiick-3.5 引擎 lua 版本
一 问题如下:
① 在Cocostudio中做界面 使用 scrollview 控件 ,然后 scrollview 控件的 item 点击事件 是 ImageView
② 当拖动 scrollview 的时候会 触发 item 的点击事件,照成体验及其的差。
二 解决方案
① 重写 imageview的 点击事件 添加一个成员变量
② 实现基本原理:
1.首先判断当前imageview 是否接收了吞噬事件。如果不吞噬事件然后再进行事件阻断操作。
2.将点击的起始坐标 转化成世界坐标 然后对比 点击结束后的坐标 如果 位置不一致 就不派发 点击事件
public:
virtual bool onTouchBegan(Touch *touch, Event *unusedEvent);
virtual void onTouchEnded(Touch *touch, Event *unusedEvent);
private:
Vec2 _touchBeganWorldPosition;
② 方法实现
bool ImageView::onTouchBegan(Touch *touch, Event *unusedEvent)
{
_hitted = false;
if (isVisible() && isEnabled() && isAncestorsEnabled() && isAncestorsVisible(this) )
{
_touchBeganPosition = touch->getLocation();
bool isSwallowTouches = this->isSwallowTouches();
if (!isSwallowTouches)
{
_touchBeganWorldPosition = convertToWorldSpace(_touchBeganPosition);
}
if(hitTest(_touchBeganPosition) && isClippingParentContainsPoint(_touchBeganPosition))
{
_hitted = true;
}
}
if (!_hitted)
{
return false;
}
setHighlighted(true);
/*
* Propagate touch events to its parents
*/
if (_propagateTouchEvents)
{
this->propagateTouchEvent(TouchEventType::BEGAN, this, touch);
}
pushDownEvent();
return true;
}
void ImageView::onTouchEnded(Touch *touch, Event *unusedEvent)
{
_touchEndPosition = touch->getLocation();
bool isSwallowTouches = this->isSwallowTouches();
if(!isSwallowTouches){
Vec2 newWorldPos = convertToWorldSpace(_touchEndPosition);
const static float kMenuMinMove = 2;
if (fabs(newWorldPos.x - _touchBeganWorldPosition.x)>kMenuMinMove || fabs(newWorldPos.y-_touchBeganWorldPosition.y)>kMenuMinMove)
{
return;
}
}
/*
* Propagate touch events to its parents
*/
if (_propagateTouchEvents)
{
this->propagateTouchEvent(TouchEventType::ENDED, this, touch);
}
bool highlight = _highlight;
setHighlighted(false);
if (highlight)
{
releaseUpEvent();
}
else
{
cancelUpEvent();
}
}
用了以上的方法后,效果实现。
方法参考网址:http://blog.csdn.net/n5/article/details/38266855