Unity TreeView2



唔,之前的Treeview感觉不太好用,所以。。又写了个

代码在https://download.csdn.net/download/qq_17813937/10528783

每次改变节点状态都会从新计算节点坐标

    private void UpdatePos(TreeItemData data, int index = -1)
    {
        if (data != root)
        {
            if (data.target.gameObject.activeSelf)
            {
                if (!(index == 0 && data.parent.id == 0))
                {
                    if (index != 0) currentHeight += GetSpace(data);
                    else currentHeight += space;
                }
                data.target.localPosition = itemParent.localPosition - new Vector3(-data.indentLevel * indent - padding.x, currentHeight + padding.y);
                currentHeight += GetHeight(data);
            }
        }

        int count = data.childs.Count;
        for (int i = 0; i < count; i++)
        {
            UpdatePos(data.childs[i], i);
        }
    }


每次改变节点状态,都需要更新 conent的大小,以供滚动

    private void UpdateSize()
    {
        int count = items.Count;
        Vector2 max = Vector2.zero;
        for (int i = 0; i < count; i++)
        {
            if (!datas[i].isShow) continue;
            var tmp = items[i].transform as RectTransform;

            var size = new Vector2(tmp.localPosition.x, -tmp.localPosition.y) + tmp.sizeDelta;

            max.x = Mathf.Max(max.x, size.x);
            max.y = Mathf.Max(max.y, size.y);
        }
        conent.sizeDelta = new Vector2(max.x + padding.width, max.y + padding.height);
    }

使用方式

using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour 
{
    
	private void Awake()
	{
        var view = GetComponent<TreeView>();
        view.CustomsChildSize(0, new Vector2(200,30));
        view.CustomsSpace(0, 30);

        view.onClick = (item, isOpen) => {
            var target = item as CustomTreeItemData;
            target.toggle.isOn = isOpen;
            Debug.Log("点击了:"+item.name.text);
        };

        view.onHideItem = item => {
            var target = item as CustomTreeItemData;
            target.toggle.isOn = false;
        };

        view.onCreateItem = item => {
            if (item.childs.Count == 0)
            {
                var target = item as CustomTreeItemData;
                target.toggle.gameObject.SetActive(false);
            }
        };


        for (int i = 0; i < 10; i++)
        {
            view.AddData<CustomTreeItemData>(Random.Range(0,i), i, i.ToString());
        }
        view.Generate();
        view.AddItem<CustomTreeItemData>(9, 10, "666");
	}
    
}

public class CustomTreeItemData:TreeItemData
{
    public Toggle toggle;

    protected override void Init(Transform value)
    {
        toggle = target.GetComponentInChildren<Toggle>();
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小鱼游戏开发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值