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

        

  • 相关阅读:
    开源项目之Android Afinal框架
    DateTimePicker——开源的Android日历类库
    Android 教你打造炫酷的ViewPagerIndicator
    Android UI-仿微信底部导航栏布局
    Android 下拉刷新框架实现
    Android-设置PullToRefresh下拉刷新样式
    Android-PullToRefresh下拉刷新库基本用法
    android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形...
    Android5.0新特性——兼容性(support)
    求訪问啊啊啊啊
  • 原文地址:https://www.cnblogs.com/cci8go/p/4748711.html
Copyright © 2011-2022 走看看