Creating own ListView

PS:TaskView 的Image去掉,背景才会变透明
Let's create own ListView, for this we need to write three classes:

  • item class to keep data
  • component class to display item, derived from ListViewItem
  • ListView class derived from ListViewCustom
 
For example it will be Task View, which will be display tasks, each task have name and progress. Download TaskView package.
 
Item class will have two fields: Name and Progress. Mark class as [System.Serializable] to edit Items in Editor.
namespace UIWidgetsSamples.Tasks {
[System.Serializable]
public class Task {
public string Name; public int Progress;
}
}
 
Component class should display this item, so it will be using Text to display name, Progressbar to display progress and implement IViewData<Task> to set it values.
using UnityEngine.UI;
using UIWidgets; namespace UIWidgetsSamples.Tasks {
public class TaskComponent : ListViewItem {
public Text Name; public Progressbar Progressbar; // IViewData<Task> implementation
public void SetData(Task item)
{
Name.text = item.Name;
Progressbar.Value = item.Progress;
}
}
}
 
And combine those classes to ListView.
using UIWidgets;
namespace UIWidgetsSamples.Tasks {
public class TaskView : ListViewCustom<TaskComponent,Task> {
}
}
 
Now it's time to GameObject for ListView.
Here is step by step guide, but there is a faster way using ListViewIcons as source GameObject and redone it to you needs.
Create empty GameObject, rename it to TaskView and set size 400x300.
Add empty GameObject to TaskView, rename it to ScrollRect and set anchors to stretch and ampty space at the right side for scrollbar.
Add ScrollRect component to GameObject. With this ListView will be scrollable.
This and some following steps can be skipped if ScrollView gameobject available in your Unity version.
Add Scrollbar to ScrollRect, set direction Bottom to Top, anchors to stretch right and change size and position parametres.
Add empty GameObject to ScrollRect, rename it to Viewport, set anchors to stretch, add Image and Mask components, disable Mask Show Mask Graphic.
This restricts ListView items to the shape of the Viewport.
Mask can be replaced with RectMask2D.
Add empty GameObject to Viewport, rename it to List, set anchors to stretch, Pivot.Y = 1, add EasyLayout and Content Size Fitter components.
Set EasyLayout: Layout Type = Grid; Grid Constraint = Fixed Column Count; Grid Constraint Count = 1.
Set Content Size Fitter: Vertical Fit = Preferred Size.
For Horizontal ListView you should set Grid Constraint = Fixed Row Count and Horizontal Fit = Preferred Size instead.
List will be contain items gameobjects and control layout.
You can use Vertical Layout Group or Horizontal Layout Group instead EasyLayout, but in this case changing ListView direction will be impossible in runtime.
Add Image GameObject to List, rename it to DefaultItem, set anchors to top stretch, set height, set empty space from left and right.
Add Text GameObject to DefaultItem, rename it to Name, set anchors to stretch, set right = 200, this will be space for Progressbar.
Set Text vertical alignment to middle.
Add Progressbar GameObject to DefaultItem, set anchors to middle right, position it to right side.
Now we can add Task Component to DefaultItem and attach Name and Progressbar gameobjects to component fields.
Attach Scrollbar GameObject to ScrollRect Vertical Scrollbar.
Finally we add Task View component to TaskView GameObject.
Attach ScrollRect GameObject to ScrollRect field.
Attach List GameObject to Container field.
Attach DefaultItem GameObject to DefaultItem field.
Let's add some items to Task View.
And run scene.
Items displayed with correcty, but does not have any visual feedback to interactions. Let's fix it.
Set TaskView colors:
DefaultColor = 255, 215, 115, 255
DefaultBackgroundColor = 255, 215, 115, 0 (transparent)
HighlightedColor = 0, 0, 0, 255 (black)
HighlightedBackgroundColor = 181, 122, 36, 255
SelectedColor = 0, 0, 0, 255 (black)
SelectedBackgroundColor = 196, 156, 39, 255
Change DefaultItem Image color to transparent.
Change DefaultItem Text color to 255, 215, 115, 255.
Now run scene again and check interactions.
Background color changes on selection and mouse over.
Now add Text color changes on selection and mouse over.
For this override GraphicsForeground property in component class. (And you can also override GraphicsBackground property.)
GraphicsForeground and GraphicsBackground should return array of Graphic objects for coloring.

using System.Collections;
using System.Collections.Generic;
using UIWidgets;
using UnityEngine;

public class TaskView : ListViewCustom<TaskComponent,Task> {

public static readonly System.Comparison<Task> ItemComparsion = (x, y) => x.Name.CompareTo(y.Name);

public override void Start()
{
base.Start();
DataSource.Comparison = ItemComparsion;//通过ItemComparsion这个来进行对数据进行排序
}
//改变
protected override void SetData(TaskComponent component, Task item)
{
component.SetData(item);
}

//===根据状态动态改变文本颜色
protected override void HighlightColoring(TaskComponent component)
{
base.HighlightColoring(component);
component.Name.color = HighlightedColor;
}

protected override void SelectColoring(TaskComponent component)
{
base.SelectColoring(component);
component.Name.color = SelectedColor;
}

protected override void DefaultColoring(TaskComponent component)
{
base.DefaultColoring(component);
component.Name.color = DefaultColor;
}
//==========================
}

 
Now text also change color with interactions.
TaskView is completed, but we can add some features.
Let's implement automatic sort for items.
ItemsComparison function compare tasks by name and used to sort items.
using UIWidgets;

namespace UIWidgetsSamples.Tasks {
public class TaskView : ListViewCustom<TaskComponent,Task> {
public static readonly System.Comparison<Task> ItemsComparison = (x, y) => x.Name.CompareTo(y.Name); bool isStartedTaskView = false; public override void Start()
{
if (isStartedTaskView)
{
return ;
}
isStartedTaskView = true; base.Start();
DataSource.Comparison = ItemsComparison;
}
}
}
 
Add new item.
Run scene, and check if items sorted by name.
If we change Task.Progress value, it will not be displayed, but we can implement it.
Replace Task Progress field with property and add OnProgressChange event.
So now we can get event when Progress value changed.
using UnityEngine;
using UnityEngine.Serialization;
using UIWidgets; namespace UIWidgetsSamples.Tasks {
[System.Serializable]
public class Task {
public string Name; [SerializeField]
[FormerlySerializedAs("Progress")]
int progress; public int Progress {
get {
return progress;
}
set {
progress = value;
if (OnProgressChange!=null)
{
OnProgressChange();
}
}
} public event OnChange OnProgressChange;
}
}
 
Now we need to add event support in Task Component.
When Progress value changed will be called UpdateProgressbar function.
using UnityEngine.UI;
using UIWidgets; namespace UIWidgetsSamples.Tasks {
public class TaskComponent : ListViewItem, IViewData<Task> {
public override Graphic[] GraphicsForeground {
get {
return new Graphic[] {Name, };
}
} public Text Name; public Progressbar Progressbar; Task item; public Task Item {
get {
return item;
}
set {
if (item!=null)
{
item.OnProgressChange -= UpdateProgressbar;
}
item = value;
if (item!=null)
{
Name.text = item.Name;
Progressbar.Value = item.Progress; item.OnProgressChange += UpdateProgressbar;
}
}
} public void SetData(Task item)
{
Item = item;
} void UpdateProgressbar()
{
Progressbar.Animate(item.Progress);
} protected override void OnDestroy()
{
Item = null;
}
}
}
 
And we need test script to check how it works.
It will add task and task progress will be updated every second on random value in range 1..10.
using UnityEngine;
using System.Collections; namespace UIWidgetsSamples.Tasks {
public class TaskTests : MonoBehaviour
{
public TaskView Tasks; public void AddTask()
{
var task = new Task(){Name = "Random Task", Progress = 0}; Tasks.DataSource.Add(task); StartCoroutine(UpdateProgress(task, 1f, Random.Range(1, 10)));
} IEnumerator UpdateProgress(Task task, float time, int delta)
{
while (task.Progress < 100)
{
yield return new WaitForSeconds(time);
task.Progress = Mathf.Min(task.Progress + delta, 100);
}
}
}
}
 
Create button and attach test script to it.
Add AddTask() to OnClick event.
And check how it's works.
原文出处:https://ilih.ru/unity-assets/UIWidgets/docs/Manual.Creating_own_ListView/  但是和原文有写区别,可能是包用的不一样导致的
源码地址:http://code.taobao.org/svn/UIWigetsTestDemo/trunk

Unity WidgetsUI CreateTaskView Demo的更多相关文章

  1. Unity ---WidgetsUI CreateTileView Demo

    以下教程基于:WidgetsUI 第三方扩展包 WidgtsUI 官网文档地址:https://ilih.ru/unity-assets/UIWidgets/docs/ 1.创建一个空GameObje ...

  2. Unity制作FPS Demo

    等到把这个Unity FPS Demo[僵尸杀手]完成后再详细补充一下,使用Unity制作FPS游戏的经历,今天做个标识.

  3. Unity VR-播放demo模型后无法移动视角

    资源源于:小意思VR 唉..可怜一下自己,这个问题百度google也不知道怎么搜,没搜出来,在群里问出来的. 当时感觉自己Unity有问题..(就是因为自己啥也不会看不懂) 按右键.或者WASD视角都 ...

  4. 扩展Unity的方法

    写更少代码的需求 当我们重复写一些繁杂的代码,或C#的一些方法,我们就想能不能有更便捷的方法呢?当然在unity中,我们对它进行扩展. 对unity的类或C#的类进行扩展有以下两点要注意: 1.这个类 ...

  5. Unity手游之路<一>C#版本Protobuf

    http://blog.csdn.net/janeky/article/details/17104877 个游戏包含了各种数据,包括本地数据和与服务端通信的数据.今天我们来谈谈如何存储数据,以及客户端 ...

  6. Unity WebSocket(仅适用于WebGL平台)

    !!!转载注明:http://www.cnblogs.com/yinlong1991/p/unity_ylwebsocket.html Unity WebSocket 使用 1.下载 YLWebSoc ...

  7. 支付宝Unity

    原地址:http://blog.csdn.net/sgnyyy/article/details/20444627 说明:支付宝Android的SDK接入只有一个接口,付费. 1. Android代码的 ...

  8. Unity 3(二):Unity在AOP方面的应用

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): AOP简介: Interception using Unity示例 配置文件示例 一.AOP简介 AO ...

  9. Unity Shader学习笔记 - 用UV动画实现沙滩上的泡沫

    这个泡沫效果来自远古时代的Unity官方海岛Demo, 原效果直接复制3个材质球在js脚本中做UV动画偏移,这里尝试在shader中做动画并且一个pass中完成: // Upgrade NOTE: r ...

随机推荐

  1. Cassandra的数据模型的理解

           Cassandra属于NoSQL数据库,NoSQL和传统关系型数据库不同,NOSQL偏好数据冗余,因为NoSQL一般无法做表关联查询. (1) keySpace 基本上可以将Keyspa ...

  2. haproxy负载均衡的安装配置

    haproxy是一款可靠,高性能的并且可以支持TCP/HTTP的负载均衡器,和前面说过的nginx负载均衡类似,这里haproxy对于负载均衡来说更专业,支持的配置选项更多,稳定性也很强,甚至只需要一 ...

  3. 实录分享 | 计算未来轻沙龙:揭秘AutoML技术(视频 + PPT)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/83542784 10 月 27 日 ...

  4. CDH:cdh5环境mkdir: Permission denied: user=root, access=WRITE, inode="/user":hdfs:hadoop:drwxr-xr-x

    产生问题原因: 环境hadoop2,cdh5创建 使用hadoop fs -mdkir /use/xxx创建文件路径时,出现权限问题 前提我们已经把当前用户zhangsan和root放到/etc/su ...

  5. Visual Studio 2015 与 .NET 4.6 RTM 正式发布

    原文地址 微软终于正式发布了Visual Studio 2015产品家族的RTM版本,此次发布体现了微软在开发工具发展方向上的转变迈出了重要的一步,他们致力于提供一种支持在所有主流应用平台上进行应用开 ...

  6. 阿里云的免费型DV SSL证书

    阿里云提供的免费型DV SSL. 证书的说明: [公告]免费新根证书,切入DigiCert PKI体系,兼容性如下操作系统版本IOS 5.0+.Android 2.3.3+.JRE 1.6.5+.WI ...

  7. --save与--save-dev的区别

    --save安装的包会在生产和开发环境中都使用: --save-dev的包只在开发环境中使用,在生产环境中就不需要这个包了,不再打包:

  8. ThinkPad T420 Fn+F5

    关于F5,可做如下设置:     1)官网win7系统下载SIhotkey[8jvu39ww].exe:最新版本的我没测试,应该也可以用.     2)双击安装,并按程序安装,直到要你选择安装on s ...

  9. Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)

    最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文.因为我是修改4.0.3的Launcher,所以后面文章里面的Launch ...

  10. Vue中的computed属性

    阅读Vue官网的过程中,对于计算属于与监听器章节的内容有点理解的不清晰:https://cn.vuejs.org/v2/guide/computed.html. 后来上网查询了资料,结合官网的说明,总 ...