对Scrollbar实现平时隐藏,滑动时出现

最近美术提了一个需求,这个滑动块需要在ScrollView静止时隐藏,滑动时出现。

我尝试了很久,发现ScrollRect下的bar是不可以SetActive(false)的,检视面板上取消也不可以。

那怎么办,一个程序员不应该轻易放弃!

所以我发现在他的子物体下用以显示bar的其实是一个image,原名为Handle,我一般会对要操作的物体进行名称修改,所以修改命名为HandleImg。

把这个物体隐藏,其实也就阻止了Scrollbar的显示。

这里还只说到了怎么隐藏Scrollbar,还是用的黑科技,那实际操作应该是什么样子。

首先需要在ScrollRect里添加一个委托,我习惯用代码添加,也就是在代理对ScrollRect添加监听,函数必须含有参数Vector2

原来的代码会导致只要执行到DOFade(0, 1).OnComplete(...)的时候,就会无法阻挡的让HandleBar消失。

其实改起来也还好改,代码如下:

    void Start()
    {
        ScrollRect.onValueChanged.AddListener(WhenViewDrag);
    }

    private float appearTime = 1;

    private Coroutine m_delayHideHandle = null;

    //记录这个ScrollView停止时的位置
    private Vector3 lastViewPortPosition = Vector3.zero;

    private void WhenViewDrag(Vector2 value)
    {
        if((int)lastViewPortPosition.y == (int)value.y)
        {
            //如果和上次的Y位置相同,则不做处理
            return;
        }
        //重置颜色,并停止褪色的动作
        HandleImg.GetComponent<Image>().DOKill();
        HandleImg.GetComponent<Image>().DOFade(1, 0);
        HandleImg.gameObject.SetActive(true);
        appearTime = 1;

        lastViewPortPosition = value;
        if(m_delayHideHandle != null)
        {
            StopCoroutine(m_delayHideHandle);
        }
        m_delayHideHandle = StartCoroutine(DelayCheck());
    }

    private IEnumerator DelayCheck()
    {
        while(appearTime > 0)
        {
            yield return new WaitForSeconds(0.01f);
            appearTime -= 0.01f;
        }
        Debug.Log("Prepare to hide");
        HandleImg.GetComponent<Image>().DOFade(0, 1).OnComplete
        (
            () =>
            {
                Debug.Log("Remove Coroutine");
                HandleImg.gameObject.SetActive(false);
                HandleImg.GetComponent<Image>()DOFade(1, 0);
                m_delayHideHandle = null;
            }
        );
    }

//思路其实是这样,每当View检测到移动,就调用这个协程,在协程倒计时里,如果View没有再移动,就执行褪色方法。

=====修改====

近来和朋友聊天时发现,原来可以直接对Image进行DOFade操作,原本的我一直以为需要对.material进行DOFade。

因此代码由HandleImg.GetComponent<Image>().material.DOFade -->HandleImg.GetComponent<Image>().DOFade,这样可以直接对图片进行褪色而不是material了。

另外,如果发现Image.DOFade不存在,则说明Dotween的版本较低,可以去下载新的Dotween插件,或者自己对Dotween方法进行拓展,自己写一个对图片的褪色方法来针对填补。

====end修改====

上述的思路已经是个错误的思路了,留在这里是为了看下这个心路历程。应该是每次发现有移动,就重置这个协程,从头到尾彻底重置。

如果View有移动,就刷新appearTime,这样协程也就不会执行到褪色那一步。

需要注意的是,因为material是实际存在的,我使用的是UIFadeMat这个,执行DOFade(0, 1)后,这个mat也就真的看不见了。所以必须要在OnComplete()里复原这个mat。

我只是做个抛砖引玉,肯定有更好的办法。如果碰到这样的需求,在没有更好的思路情况下,可以参考一下这个办法。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值