Laya实现滑动列表和翻页效果及优化

12 篇文章 0 订阅
2 篇文章 0 订阅

__前言: __ 在前端游戏开发中,我们经常需要做滑动列表,或者列表翻页的效果,笔者最近接触Laya编辑器,看官方的文档真的是看的生气,索性参照其他编辑器的方式实现了想要的效果,这里整理出来。
效果展示:
滑动
翻页
前期准备:
这里要先创建一个List组件,为其添加一个scrollerBar,(这里根据需求,如果需要垂直方向滑动就加VscrollerBar),
image
需要注意的是,List组件的name需要写 render,renderType属性要选择 render.HscrollerBar的name也要写scrollBar.(官网文档就是这么强调的,我也没办法),然后给你的List定义一个名称,我这里用的是proGp;好了,准备好这些,我们开始写代码。
代码示例:

private initProductGp() {
        // ...
        this.proGp.itemRender = ProductItem;
        this.proGp.renderHandler = new Laya.Handler(this, this.updateItem);

        let dataArr = [
            { "typeImage": 0, "doneTime": 1e4 }, { "typeImage": 1, "doneTime": 2e4 }, { "typeImage": 2, "doneTime": 1e4 },
            { "typeImage": 3, "doneTime": 1e4 }, { "typeImage": 4, "doneTime": 2e4 }, { "typeImage": 5, "doneTime": 1e4 },
            { "typeImage": 6, "doneTime": 1e4 }, { "typeImage": 7, "doneTime": 2e4 }, { "typeImage": 8, "doneTime": 1e4 },
            { "typeImage": 9, "doneTime": 2e4 }, { "typeImage": 10, "doneTime": 1e4 }, { "typeImage": 11, "doneTime": 1e4 }
        ];
        // 给数据源赋值
        this.proGp.array = dataArr;
        // 设置滑动条隐藏
        this.proGp.scrollBar.hide = true;
        // 设置滚轮滑动为false,默认为true
        // ... 这里是展示翻页效果,如果需要滑动的效果,这两个
        // ... 属性可以忽略,使用默认值即可
        this.proGp.scrollBar.mouseWheelEnable = false;
        // 设置是否开启触摸,默认值为true
        this.proGp.scrollBar.touchScrollEnable = false;
        this.proGp.scrollBar.changeHandler = new Laya.Handler(this, this.onScrollerChange);
        // 初始化完,先执行一次,
        this.onScrollerChange();
    }
    /***赋值数据源***/
    private updateItem(cell: ProductItem, index: number): void {
        cell.setData(true, cell.dataSource);
    }

这里说明一下ProductItem这个类.这个类是一个继承自页面的类,需要我们注意的是,我们不能在构造函数里给它自身的data赋值,因为我们是作为List列表的render去使用的,在render的过程中,会由于异步的问题,导致在new的时候还没有接受到数据源。从而导致对对象的赋值失败。所以我们要写一个public的方法,来给data赋值。(在egret中,只要继承了itemRender类,就可以重写它的dataChange方法,同样的道理。)

class ProductItem extends ui.work.ProductItemUI {
    private _data: ProductData;
    constructor() {
        super();
    }
    public setData(data: ProductData) {
        this._data = data;
        this.img_product.skin = `work/proM_${this._data.typeImage + 1001}.png`;
    }
 }

这个时候,我们的滑动滚动列表就可以实现了,接下来是翻页的效果实现。

// 这里按一下翻页,一次翻5种原料.
    private nextPage() {
        let scrollV = this.proGp.scrollBar.value + (GameGlobal.PRODUCT_WIDTH * 5);
        if (scrollV >= (GameGlobal.PRODUCT_WIDTH * 7)) {
            scrollV = (GameGlobal.PRODUCT_WIDTH * 7);
        }
        Laya.Tween.to(this.proGp.scrollBar, { value: scrollV }, 500, Laya.Ease.sineInOut);
    }
    private previousPage() {
        let scrollV = this.proGp.scrollBar.value - (GameGlobal.PRODUCT_WIDTH * 5);
        if (scrollV <= 0) {
            scrollV = 0;
        }
        Laya.Tween.to(this.proGp.scrollBar, { value: scrollV }, 500, Laya.Ease.sineInOut);
    }
    /***滚动条位置变化回调***/
    private onScrollerChange() {
    // 这里是设置翻页箭头的隐藏和显示,如果没有这个需求也可以忽略
        if (this.proGp.scrollBar.value <= 0) {
            this.previousBtn.visible = false;
        }
        else if (this.proGp.scrollBar.value >= (GameGlobal.PRODUCT_WIDTH * 7)) {
            this.nextBtn.visible = false;
        }
        else {
            this.previousBtn.visible = this.nextBtn.visible = true;
        }
    }

这里我用Tween做了一个缓动的翻页效果,大家可以根据自己的需求自行更改。
结束语:
好了,一个简单的滑动列表加翻页列表的效果就做完了,其实不止前端的东西,只要是做开发,不管途径和方式有多少种,编程思想都是一致的,我们不能光看到前端方向有五花八门的引擎,有各种各样的语言就望而却步,只要我们掌握了核心的思想,换不同的开发工具都没问题,不同的开发语言,只不过是API的不同罢了。希望大家都能在前端开发的过程中顺风顺水!

如果我的文章帮助到了你,或者给你提供了一些思路,麻烦给我点个赞鼓励一下我,嘻嘻~

推荐一个非常简单好用的GIF录制工具:GifCam

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Laya3D是一款基于HTML5技术的3D游戏引擎,它可以运行在多个平台上,包括PC、移动设备和Web。实现战争迷雾效果需要以下步骤: 1. 创建一个地图模型,包括战场和障碍物。 2. 创建一个相机,并设置其位置和朝向,以便能够正确地观察地图。 3. 创建一个光源,可以使用点光源、方向光源或者环境光源。 4. 创建一些材质,用于给地图和障碍物上色。 5. 创建一个迷雾层,用于遮挡地图和障碍物。 6. 在场景中添加一个渲染器,用于将场景渲染到屏幕上。 7. 在每帧更新时,根据相机的位置和迷雾层的范围,计算出需要显示的部分,并将其渲染到屏幕上。 以下是一个简单的示例代码: ```javascript Laya3D.init(0, 0, true); // 创建场景和相机 var scene = Laya.stage.addChild(new Laya.Scene()); var camera = scene.addChild(new Laya.Camera(0, 0.1, 100)); camera.transform.translate(new Laya.Vector3(0, 10, -20)); camera.transform.rotate(new Laya.Vector3(-30, 0, 0), true, false); // 创建光源 var light = scene.addChild(new Laya.DirectionLight()); light.color = new Laya.Vector3(1, 1, 1); light.direction = new Laya.Vector3(0.3, -1, 0); // 创建地图模型和材质 var map = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createPlane(50, 50))); var mapMat = new Laya.BlinnPhongMaterial(); mapMat.albedoColor = new Laya.Vector4(0.5, 0.5, 0.5, 1); mapMat.renderMode = Laya.BlinnPhongMaterial.RENDERMODE_OPAQUE; map.meshRenderer.material = mapMat; // 创建障碍物模型和材质 var obstacle = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createBox(1, 2, 1))); var obstacleMat = new Laya.BlinnPhongMaterial(); obstacleMat.albedoColor = new Laya.Vector4(0, 0.5, 0, 1); obstacleMat.renderMode = Laya.BlinnPhongMaterial.RENDERMODE_OPAQUE; obstacle.meshRenderer.material = obstacleMat; obstacle.transform.translate(new Laya.Vector3(-5, 0, 0)); // 创建迷雾层和材质 var fogLayer = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createPlane(50, 50))); var fogMat = new Laya.UnlitMaterial(); fogMat.albedoColor = new Laya.Vector4(0, 0, 0, 1); fogMat.renderMode = Laya.UnlitMaterial.RENDERMODE_TRANSPARENT; fogMat.renderQueue = Laya.Material.RENDERQUEUE_TRANSPARENT; fogLayer.meshRenderer.material = fogMat; fogLayer.transform.translate(new Laya.Vector3(0, 10, 0)); fogLayer.transform.rotate(new Laya.Vector3(90, 0, 0), true, false); // 创建渲染器 var renderer = Laya.stage.addChild(new Laya.Renderer()); renderer.render(scene, camera); // 更新迷雾层 Laya.timer.frameLoop(1, this, function() { var range = 5; // 迷雾范围 var pos = camera.transform.position; var fogPos = fogLayer.transform.position; fogPos.x = pos.x; fogPos.z = pos.z; fogMat.tilingOffset = new Laya.Vector4(range, range, -pos.x / range, -pos.z / range); }); ``` 在这个示例中,我们创建了一个简单的地图和障碍物,并使用BlinnPhongMaterial和UnlitMaterial给它们上色。然后创建了一个迷雾层,使用UnlitMaterial和透明渲染模式来遮挡地图和障碍物。在每帧更新时,根据相机的位置和迷雾范围,更新迷雾层的位置和纹理坐标,以实现迷雾效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值