白鹭引擎之Scroller容器



最近由我这个Unity3D大师负责公司H5项目,主要实现白鹭引擎Scroller滚动框中物体可以拖拽的效果,并且物体拖拽时,Scroller不可滚动。。。我这门外汉一听这要求,瞬间想打死策划。我研究了一下Scroller,首先,如果要想有物体跟着Scroller滚动,那该物体必须放到Scroller的Group中。but,问题来了,Group里的物体是不可以被拖到滚动框外的,这特码就尴尬了。
               白鹭引擎之Scroller容器    白鹭引擎之Scroller容器
不要着急,问题总会一件一件一件一件被解决掉的。

---------------------------------Scroller左右滚动------------------------------------

首先我们先让Scroller左右滚动起来,它有两个参数scrollPolicyV、scrollPolicyH,通过"ON""OFF""AUTO"可以控制上下左右可不可以滚动,在这里我们设置让它只能水平滚动   
        this.Scroller.scrollPolicyV = eui.ScrollPolicy.OFF;
        this.Scroller.scrollPolicyH = eui.ScrollPolicy.ON;
需要注意的是,不可以写成this.Scroller.scrollPolicyV = "OFF";this.Scroller.scrollPolicyH ="ON";否则Scroller上下左右都不会滚动了。下面四行代码是设置水平滑动条不可见:
        this.Scroller.horizontalScrollBar.autoVisibility = false;
        this.Scroller.horizontalScrollBar.visible = false;

--------------------------------物体可以被拖拽出来-----------------------------------

Group下的元素是不可以拖出来的,那只好在拖动那个元素(A)的时候,将该元素(A)隐藏,将外面的和它一样的元素(B)显示出来。此时遇到的问题是拖动元素的时候滚动框也会滚动,这效果就太差劲了。
我采取的解决办法是当鼠标左右滑动的时候,滚动条左右滑动,元素不可以被拖动;当鼠标向上滑动时,滚动条不动,元素开始拖动。但是鼠标不会标准的左右或上下滑动,很可能左上、右上,此时就需要特殊处理:水平移动距离小于垂直移动距离则视为鼠标向上滑动,水平移动距离大于等于垂直移动距离则视为鼠标左右滑动。
  
   this.choose_1.visible = false;
   this.choose_2.visible = false;
   this.choose_1_0.visible = true;
   this.choose_2_0.visible = true;
   this.choose_1.touchEnabled = true;
   this.choose_2.touchEnabled = true;
  记录点击到物体上的时候鼠标位置
   private oldImgX: number = 0;
   private oldImgY: number = 0;
  choose_1_0系列为Group里的元素,choose_1系列为外边的元素。
  this.choose_1_0.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onImgClick, this);
  this.choose_2_0.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onImgClick, this);
  this.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.onMove, this);

  private onImgClick(event: egret.TouchEvent) {
        var btn: eui.Image = event.target;
        this.oldImgX = event.stageX;
        this.oldImgY = event.stageY;
    }

  private onMove(evt: egret.TouchEvent) {
        var btn: eui.Image = evt.target;
    以下代码为:鼠标垂直滑动大于水平滑动,元素(A)可以被拖动,A隐藏,B显示:
        if (Math.abs(evt.stageY - this.oldImgY) > (Math.abs(evt.stageX - this.oldImgX) + 5)) 
        {
            if (btn == this.choose_1_0) {
                console.log("1");
                this.choose_1.x = evt.stageX + this.Scroller.x;
                this.choose_1.y = this.choose_1_0.y + this.Scroller.y;
                // this.choose_1.y = this.Scroller.y + this.Scroller.height / 2;
                this.choose_1.visible = true;
                this.choose_1_0.visible = false;
            }
            if (btn == this.choose_2_0) {
                console.log("2");
                this.choose_2.x = evt.stageX + this.Scroller.x;
                this.choose_2.y = this.Scroller.y + this.Scroller.height / 2;
                this.choose_2.visible = true;
                this.choose_2_0.visible = false;
            }

    以下代码为:鼠标触发事件点在Scroller上方时(白鹭引擎原点在左上角),滚动条停止滚动:
           if (evt.stageY < this.Scroller.y) 
           {
               this.Scroller.scrollPolicyH = eui.ScrollPolicy.OFF;
           }
           else {
               this.Scroller.scrollPolicyH = eui.ScrollPolicy.ON;
           }
     以下代码为:物体跟随鼠标移动:
          this.touchImg = btn;
          if (this.touchImg != null) {
             if (this.touchImg == this.choose_1 || this.touchImg == this.choose_2)
             {
                this.touchImg.x += (evt.stageX - this.oldImgX);
                this.touchImg.y += (evt.stageY - this.oldImgY);

                if (this.touchImg.x < 0)
                    this.touchImg.x = 0;
                if (this.touchImg.x > this.stage.stageWidth - this.touchImg.width / 2)
                    this.touchImg.x = this.stage.stageWidth - this.touchImg.width / 2;
                if (this.touchImg.y < 0)
                    this.touchImg.y = 0;
                if (this.touchImg.y > this.stage.stageHeight - this.touchImg.height / 2)
                    this.touchImg.y = this.stage.stageHeight - this.touchImg.height / 2;

                this.oldImgX = evt.stageX;
                this.oldImgY = evt.stageY;
            }
         }
       }
                    白鹭引擎之Scroller容器    白鹭引擎之Scroller容器

注意:
  • event.stageX:点击在舞台中的位置的X坐标,以舞台左上角为(0,0)点
  • event.localX:点击在物体身上的位置的X坐标,以物体的原点为(0,0)点




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值