需求做一个待机界面,图片自动轮播,直接替换Texture实现了,被提意见切换生硬,那就加个滑动效果吧,用两个RawImage
交替显示实现。
代码逻辑的简要总结:
-
Start
方法中,初始化了RawImageSlider
,加载图片,并启动了SwitchImage
协程来执行图片轮播。 -
LoadfullPath
方法负责从指定路径加载图片,并将其转换为Texture2D
对象添加到Tex2d
列表中。 -
SwitchImage
协程用于间隔一段时间后切换图片,并调用ShowCurrentImage
方法实现动画效果。 -
GenerateRawImages
方法在程序启动时加载了初始的两张图片。 -
ShowCurrentImage
方法根据当前的rectTransformID
和rectTransform1
的位置执行图片的切换动画,并在完成后调用ResetIndex
方法来显示新的图片。 -
ResetIndex
方法用于重置图片和位置,在切换动画完成后回归到初始状态。
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class RawImageSlider : MonoBehaviour
{
[HideInInspector] public List<string> RawImageFiles; // 存储图片文件路径的数组
List<Texture2D> Tex2d = new List<Texture2D>(); // 图片列表
public List<RawImage> images = new List<RawImage>(); // 存放轮换的RawImage
public int currentIndex = 0; // 当前显示的图片索引
string fullPath;
RectTransform rectTransform, rectTransform1;
public float switchInterval = 5.0f; // 切换间隔时间
int rectTransformID = -1; // 轮换UI的序号
void Start()
{
rectTransform = images[0].GetComponent<RectTransform>();
rectTransform1 = images[1].GetComponent<RectTransform>();
// 图片在StreamingAssets中的路径
fullPath = Application.streamingAssetsPath + "/" + "待机图片";
LoadfullPath(); // 加载图片路径并处理
StartCoroutine(SwitchImage()); // 启动轮播协程
}
// 加载图片路径并处理
void LoadfullPath()
{
string imgtype = "*.BMP|*.JPG|*.GIF|*.PNG";
string[] ImageType = imgtype.Split('|');
//获取待机图片
for (int i = 0; i < ImageType.Length; i++)
{
//获取Application.streamingAssetsPath文件夹下所有的图片路径
string[] dirs = Directory.GetFiles(fullPath, ImageType[i]);
for (int j = 0; j < dirs.Length; j++)
{
RawImageFiles.Add(dirs[j]);
}
}
// 加载图片到Texture2D列表
for (int i = 0; i < RawImageFiles.Count; i++)
{
Texture2D tx = new Texture2D(100, 100);
tx.LoadImage(getImageByte(RawImageFiles[i]));
Tex2d.Add(tx);
}
GenerateRawImages(); // 生成轮播图片
}
/// <summary>
/// 根据图片路径返回图片的字节流byte[]
/// </summary>
/// <param name="imagePath">图片路径</param>
/// <returns>返回的字节流</returns>
private static byte[] getImageByte(string imagePath)
{
FileStream files = new FileStream(imagePath, FileMode.Open);
byte[] imgByte = new byte[files.Length];
files.Read(imgByte, 0, imgByte.Length);
files.Close();
return imgByte;
}
// 轮播图片协程
IEnumerator SwitchImage()
{
while (true)
{
yield return new WaitForSeconds(switchInterval);
currentIndex = (currentIndex + 1) % Tex2d.Count; // 更新当前显示的图片索引
rectTransform1.gameObject.SetActive(true); // 激活第二张图片的显示
rectTransformID++; // 更新轮换UI的序号
ShowCurrentImage(); // 显示当前图片
}
}
// 生成轮播图片
void GenerateRawImages()
{
if (Tex2d.Count >= 2)
{
images[0].texture = Tex2d[0];
images[1].texture = Tex2d[1];
currentIndex = 1;
// 初始设置图片位置
rectTransform.DOAnchorPosX(0, 0.1f).SetEase(Ease.Linear);
rectTransform1.gameObject.SetActive(false);
rectTransform1.DOAnchorPosX(rectTransform.rect.width, 0.1f).SetEase(Ease.Linear);
rectTransformID = -1;
}
else
{
Debug.LogError("图片数量不足,无法进行轮播展示!");
}
}
// 显示当前图片
private void ShowCurrentImage()
{
if (rectTransformID == 0)
{
// 图片向左移动,移动完成后调用ResetIndex方法
rectTransform.DOAnchorPosX(-rectTransform.rect.width, 1f).SetEase(Ease.Linear).OnComplete(ResetIndex);
rectTransform1.DOAnchorPosX(0, 1f).SetEase(Ease.Linear);
}
else
{
// 图片向左移动,移动完成后调用ResetIndex方法
rectTransform1.DOAnchorPosX(-rectTransform.rect.width, 1f).SetEase(Ease.Linear).OnComplete(ResetIndex);
rectTransform.DOAnchorPosX(0, 1f).SetEase(Ease.Linear);
}
}
// 重置位置
private void ResetIndex()
{
if (rectTransformID == 0)
{
// 第一张图片移动到右侧,加载下一张图片
rectTransform.DOAnchorPosX(rectTransform.rect.width, 0.1f).SetEase(Ease.Linear);
images[0].texture = Tex2d[currentIndex];
}
else
{
// 第二张图片隐藏,移动到右侧,加载下一张图片
rectTransform1.gameObject.SetActive(false);
rectTransform1.DOAnchorPosX(rectTransform.rect.width, 0.1f).SetEase(Ease.Linear);
rectTransformID = -1;
images[1].texture = Tex2d[currentIndex];
}
}
}
打了个package包