zoukankan      html  css  js  c++  java
  • 解决scrollview上的menu拖动问题以及menu item在可视区外仍能触发的问题

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

    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

        

  • 相关阅读:
    案例20:地下汽车库消防设施配置案例分析
    jsonp 跨域
    Cookie 工具类
    spring md5 加密
    sso 登录业务逻辑
    maven tomcat 插件
    <url-pattern>/</url-pattern> 拦截请求
    sso 系统分析
    FreeMarker 页面静态化解决方案
    FreeMarker 整合 springmvc
  • 原文地址:https://www.cnblogs.com/cci8go/p/4748711.html
Copyright © 2011-2022 走看看