Unity实现ScrollView并包含吸顶效果

1 前言

想在Unity做一个类似android/ios的界面,可上下滑动,可吸顶,该咋做呢?
本文就来做个demo。
先上效果:
在这里插入图片描述

Scroll View是一个2D UI控件,新建好了,会自动包含子节点:
Canvas
——Scroll View
————Viewport
——————Content
其中,Viewport代表窗口区域,也就是Scroll View的可见区域。 Content代表具体内容,当Content的高度大于Scroll View的高度,则可以上下滑动!

2 创建流程

2.1 新建2D canvas,作为容器

搞一个空场景,添加一个Canvas。
在这里插入图片描述
Canvas的组件,Canvas Scaler,改成Scale With Screen Size
使用 Scale With Screen Size 模式,表示根据指定参考分辨率的像素来指定位置和大小。如果当前屏幕分辨率大于参考分辨率,则画布会保持只具有参考分辨率的分辨率,但是会放大以便适应屏幕。如果当前屏幕分辨率小于参考分辨率,则画布会相应缩小以适应屏幕。

这个模式,需要填写一个标准的分辨率。一般如果是正规公司,出UI标注图,也是在某个分辨率下的UI标注,这个分辨率,跟UI标注的分辨率一样就行啦。比如我就写828 * 1792.

接着,Canvas下,开始加一个ScrollView。一般这个View是占满整个屏幕,但离顶部有一些距离。所以设置Rect Transform如下
在这里插入图片描述
另外,ScrollView默认有蒙层,默认支持横向竖向滑动,可以根据需要拿掉。
在这里插入图片描述
接下来,一个非常重要的设置,Scroll View - Viewport - Content 节点,添加2个组件:
Vertical Layout GroupContent Size Filter
第一个,让子元素 布局按垂直排列,这样可以添加各种不同的元素,堆在一起。
第二个,是为了让Content的高度,和子元素的高度总和一致。
在这里插入图片描述

垂直布局组 (Vertical Layout Group),会将子布局元素纵向放置。这样,我们可以添加各种风格的严肃,只要是纵向布局就行。比如,来个图片,来一些文字,再来个Grid View。

这里说明一下Vertical Layout Group的属性。

属性功能
Padding布局组边缘内的填充。
Padding布局组边缘内的填充。
Spacing布局元素之间的间距。
Child Alignment用于子布局元素的对齐方式(如果这些元素未填满可用空间)。
Control Child Size布局组是否控制其子布局元素的宽度和高度。
Use Child Scale在为元素调整大小和进行布局时,布局组是否考虑其子布局元素的缩放。Width 和 Height 对应于每个子布局元素的 Rect Transform 组件中的 Scale > X 和 Scale > Y 值。
Child Force Expand是否要强制子布局元素扩展以填充额外的可用空间。

其实我们不希望子元素被控制高度,所以,全部不要选。

接着,还要加一个Content Size Filter,其中,Vertical Fit选择Preferred Size,用于自动计算Content的高度,为所有子元素的高度和。相当于Android的wrap_content属性。

2.2 Content节点添加各种元素

在Content下,新建各种View,如图所示。
在这里插入图片描述
比较重要的是GridView,可以参考Unity实现 GridView 页面

这里可以稍微强调一些重要的点:

一是GridView可以设置列数,把Constraint参数写为Fixed Column Count即可
在这里插入图片描述
二是,GridView的高度,需要设置为实际高度,即,等于(1 + itemCount/2) * itemHeight (有spacing的话,还需要加上spacing高度)。如果写一个固定值,则滑动时无法看到所有的item。
如果Item是代码动态添加,则需要代码动态修改GridView的高度。

2.3 监听滑动从而吸顶

Scroll ViewScroll Rect组件,有一个onValueChange回调,可以脚本写个函数,来接收回调:
在这里插入图片描述
脚本代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScrollViewCtl : BaseUIController
{
    private GameObject TitleBuyButton;
    private GameObject TitleName;

    public float HideFactor = 0.3f;
    // Start is called before the first frame update
    void Start()
    {
        TitleBuyButton = findObjectByPath("TitleBuyButton");
        TitleName = findObjectByPath("TitleName");

    }

    public void OnValueChange(Vector2 value)
    {
        Debug.Log("OnValueChange " + value);
        if(value.y < HideFactor)
        {
            TitleName.GetComponent<Text>().text = "欢迎光临请选择商品";
            TitleBuyButton.SetActive(true);
        } else
        {
            TitleName.GetComponent<Text>().text = "我是标题";
            TitleBuyButton.SetActive(false);
        }
    }


}

从上往下滑动,其y值从1递减到0,所以,我们可以设置一个阈值,是顶部栏占整体高度的比例,然后,用这个阈值,来对Title Bar做显隐,从而达到吸顶效果。

3 总结

最后,上个工程链接
ScrollViewDemo

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

newchenxf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值