美文网首页
FancyScrollView通用UI组件

FancyScrollView通用UI组件

作者: 侑虎科技 | 来源:发表于2020-03-03 20:32 被阅读0次

一、简介

FancyScrollView是一个可以实现复杂灵活动画效果的通用UI滑动列表组件,可以帮助开发者快速实现表现力丰富的UI滑动列表。

开源库链接:https://lab.uwa4d.com/lab/5bc4219e04617c5805d4d3a1

二、创建一个FancyScrollView

以示例项目中最基础的第一个例子为例,来看一下如何使用FancyScrollView实现一个动画滑动列表。

1、创建一个ItemData类,用于存放每个单元中所需的数据。

public class ItemData
{
    public string Message { get; }
    public ItemData(string message)
    {
        Message = message;
    }
}

2、创建一个Cell类,继承自FancyCell<itemdata style="box-sizing: border-box;">。其中有两个主要函数,UpdateContent用于刷新UI上对应ItemData中的数据内容,UpdatePosition用于控制每个Cell的滑动效果,包括位置、动画等。在Example01中,使用了Animator来控制动画。

public class MyCell : FancyCell<ItemData>
{
    [SerializeField] Animator animator = default;
    [SerializeField] Text message = default;

    public override void UpdateContent(ItemData itemData)
    {
        message.text = itemData.Message;
    }

    public override void UpdatePosition(float position)
    {
        // position 是 0.0 ~ 1.0 之间的值
        // 基于position可以自由控制Scroll的外观
        if (animator.isActiveAndEnabled)
        {
            animator.Play(AnimatorHash.Scroll, -1, position);
        }

        animator.speed = 0;
    }
}

3、创建一个ScrollView类,继承自FancyScrollView。

public class MyScrollView : FancyScrollView<ItemData>
{
    [SerializeField] Scroller scroller = default;
    [SerializeField] GameObject cellPrefab = default;

    protected override GameObject CellPrefab => cellPrefab;

    void Start()
    {
        scroller.OnValueChanged(base.UpdatePosition);
    }

    public void UpdateData(IList<ItemData> items)
    {
        base.UpdateContents(items);
        scroller.SetTotalCount(items.Count);
    }
}

4、创建一个Example01,用于初始化列表数据。

public class Example01 : MonoBehaviour
{
    [SerializeField] MyScrollView myScrollView = default;

    void Start()
    {
        var items = Enumerable.Range(0, 20)
            .Select(i => new ItemData($"Cell {i}"))
            .ToArray();

        myScrollView.UpdateData(items);
    }
}

5、创建一个Cell Prefab,为它制作一个好看的动画效果,并创建制作好对应的AnimatorController。

6、组装好这些GameObject后,即可得到一个FancyScrollView效果啦。

三、其它功能及应用

1、无限循环
如果希望实现头尾相接的循环列表,只需要设置两个选项:勾选FancyScrollView的“Loop”,并将Scroller的Movement Type设定为Unrestricted即可。

2、捕捉(Snap)

启用Snap之后,在滑动快结束时会定位到最近的一个单元,而不会停留在中间状态。这也是滑动列表非常常用的功能。同时还可以调整这里定位的速度、时长、EasingType等参数。

3、结合Shader制作列表背景
在示例4和示例5中,展示了如何使用Shader制作出表现力更丰富的滑动列表。这里给出的两个例子分别是Metaball和Voronoi效果的应用。

在Metaball.hlsl中,可以找到Shader实现的核心方法。

float4 metaball(float2 st)
{
    float scale = 4600;
    float d = 0;

    [unroll]
    for (int i = 0; i < DATA_COUNT; i++)
    {
        d += f(st - _CellState[i].xy) * _CellState[i].w;
    }

    d *= scale;
    d = abs(d - 0.5);

    float3 color = 1;
    color = lerp(color, float3(0.16, 0.07, 0.31), smoothstep(d - 0.04, d - 0.04 + 0.002, 0));
    color = lerp(color, float3(0.16, 0.80, 0.80), smoothstep(d - 0.02, d - 0.02 + 0.002, 0));
    return float4(color, 1)
}

其中_CellState为ScrollView中的Cell数据集合。xy对应的是每个Cell的位置position数据,w对应的是每个cell的缩放scale数据。

4、ScrollRect和GridView
除了常规的滑动列表外,FancyScrollView还提供了行列类的滑动列表,且在示例工程中,提供了如果修改Cell单元间距、顶距等配置方式。但这两种ScrollView不支持无限循环和捕捉功能。

四、性能测评

效果虽好,但由于这里面每个cell都用到一个Animator,在性能上也是有不少开销的。博物纳新惯例,使用UWA GOT在红米4X上测试了一下最基础示例的性能开销。

1、滑动测试
使用基础示例测试了一下持续滑动列表的情况。发现动画更新耗时和UI重建的开销在列表滑动时都比较高,是两个主要耗时函数,其耗时均值分别达到1.9ms和1.6ms。

Animators.Update耗时情况 SendWillRenderCanvases耗时情况

2、静止测试
使用同一个示例测试了一下静止状态的列表。则动画更新耗时和UI重建耗时都明显下降。耗时均值分别为0.3ms和0ms(<0.05ms)。

Animators.Update耗时情况 SendWillRenderCanvases耗时情况

五、总结

FancyScrollView可以帮助开发者快速实现灵活复杂的滑动列表动画,但如果是使用Animator的方式实现,带来的动画更新开销也会偏高一些,更适合在其它CPU压力不大的场景下使用,且需要注意制作的动画及动画状态机不宜过于复杂。

作者发布项目时的介绍使用的是日文编写,为了方便大家阅读,UWA开源库已将其翻译成中文版本,欢迎大家共同学习:https://lab.uwa4d.com/lab/5bc4219e04617c5805d4d3a1

今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......

请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。


【博物纳新】是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

更多精彩内容请关注:lab.uwa4d.com

相关文章

  • FancyScrollView通用UI组件

    一、简介 FancyScrollView是一个可以实现复杂灵活动画效果的通用UI滑动列表组件,可以帮助开发者快速实...

  • 文档结构

    项目文档结构 UI文档结构 通用组件文档结构 业务组件文档结构 store文档结构

  • 仿照element-ui 写vue通用验证组件

    最近为了练习vue,仿照elemeng-ui写了一个通用验证组件,先上element-ui的使用代码 根据elem...

  • 跨平台

    跨平台整体方案 和原生应用集成 ☆☆☆☆☆ 通用UI 组件库 ☆☆☆☆ javascript和原生相互交互 SD...

  • 2018-11-19

    组件库weex-ui Weex 原生组件的封装应该注意什么? 1. 通用性,只有多个业务同时在使用,同时具备可抽离...

  • 组件化

    组件是具体的:按照一些小功能的通用性和可复用性来抽象组件 只要有UI层的展示,就有可以组件化的地方。组件就是降一段...

  • react-redux connect方法

    1.组件 react-redux把组件分为两类:UI组件和容器组件。 UI组件的特征: 只负责 UI 的呈现,不带...

  • Flutter 之 组合实例 GradientButton(七十

    在Flutter中页面UI通常都是由一些低级别组件组合而成,当我们需要封装一些通用组件时,应该首先考虑是否可以通过...

  • Awesome Android Library

    UI 组件 Awesome Android UI Components 高质量的 Android UI 组件库 网...

  • 接入TUIKit(iOS)

    简介 腾讯云 TUIKit TUIKit 是基于腾讯云 IMSDK 的一款 UI 组件库,里面提供了一些通用的 U...

网友评论

      本文标题:FancyScrollView通用UI组件

      本文链接:https://www.haomeiwen.com/subject/xjbmkhtx.html