模仿这个网站制造一个可展开的公告牌 http://www.tasharen.com/ngui/example9.html(PS:请用ie打开)
一.首先上个最终的效果图:
二.首先创建一个ScollView,然后给Content添加一个VerticalLayoutGroup组件,并为Content创建三个Button和Text子对象,并把每个Button的Transition设为None,结果如下图所示:
三.给Canvas添加一个Image的组件,把公告牌的背景图片放上去(左图),还要给ScrollView加上一张背景(右图)
顺便提一下怎么把一张图片转化为Sprite,点击图片,把TextureType设置为Sprite(2D and UI):
四.之后设置一下ScrollView的Anchors
五.之后要弄的是设置各个Button的图片和ScrollBar的图片,颜色和设置各个Text(包括Button的Text)的内容,之后你可能
会发现文本不能全部显示和滚动条没能出现之类的问题,这是只要设置Text的高度和Content的高度就可以了,如果以上步骤都没问题的话,应该和下图差不多:
好了,到了这里,布局就完成了,剩下的就是点击button时,文本折叠起来和展开。
六.我这里是通过旋转文本和改变文本的高度来实现的,先看下代码
IEnumerator rotateIn()
{
float rx = 0;
float xy = 120;
for (int i = 0; i < frame; i++)
{
rx -= 90f / frame;
xy -= 120f / frame;
text.transform.rotation = Quaternion.Euler(rx, 0, 0);
text.rectTransform.sizeDelta = new Vector2(text.rectTransform.sizeDelta.x, xy);
if (i == frame - 1)
{
text.gameObject.SetActive(false);
}
yield return null;
}
}
这是折叠的代码,因为刚学到协程,所以是通过协程来实现的,通过每帧来改变文本的角度和文本的高度,来实现折叠的效果,展开的也类似。好了,到了这里,
整个实现也完成了,以下是所有的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Bulletin : MonoBehaviour {
private Button yourButton;
public Text text;
private int frame = 20;
// Use this for initialization
void Start()
{
Button btn = this.gameObject.GetComponent<Button>();
btn.onClick.AddListener(TaskOnClick);
}
IEnumerator rotateIn()
{
float rx = 0;
float xy = 120;
for (int i = 0; i < frame; i++)
{
rx -= 90f / frame;
xy -= 120f / frame;
text.transform.rotation = Quaternion.Euler(rx, 0, 0);
text.rectTransform.sizeDelta = new Vector2(text.rectTransform.sizeDelta.x, xy);
if (i == frame - 1)
{
text.gameObject.SetActive(false);
}
yield return null;
}
}
IEnumerator rotateOut()
{
float rx = -90;
float xy = 0;
for (int i = 0; i < frame; i++)
{
rx += 90f / frame;
xy += 120f / frame;
text.transform.rotation = Quaternion.Euler(rx, 0, 0);
text.rectTransform.sizeDelta = new Vector2(text.rectTransform.sizeDelta.x, xy);
if (i == 0)
{
text.gameObject.SetActive(true);
}
yield return null;
}
}
void TaskOnClick()
{
if (text.gameObject.activeSelf)
{
StartCoroutine(rotateIn());
}
else
{
StartCoroutine(rotateOut());
}
}
}