最近美术提了一个需求,这个滑动块需要在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。
我只是做个抛砖引玉,肯定有更好的办法。如果碰到这样的需求,在没有更好的思路情况下,可以参考一下这个办法。