码迷,mamicode.com
首页 > 其他好文 > 详细

解决scrollview上的menu拖动问题以及menu item在可视区外仍能触发的问题

时间:2015-08-21 19:03:48      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

最近在做项目发现一个让人很头疼的问题

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

 

 

 

 

 

 

    

解决scrollview上的menu拖动问题以及menu item在可视区外仍能触发的问题

标签:

原文地址:http://www.cnblogs.com/cci8go/p/4748711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!