实现类似排行版、社交模块的头像下载与管理的封装,使用者只需要对控件进行图片网络地址的设置就能完成图片刷新。为了方便,代码全写在一个脚本,需要的自己整合一下。
使用方法:将脚本挂载到RawImage控件,调用SetOnlineTexture方法,传入图片网路地址即可。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using System.Collections.Generic;
[RequireComponent(typeof(RawImage))]
public class ImageDownloader : MonoBehaviour
{
private static Dictionary<string,Texture2D> mImageCacheDict = new Dictionary<string, Texture2D>();
private RawImage mImage;
void Awake()
{
mImage = GetComponent<RawImage>();
//Test
//SetOnlineTexture("http://thirdwx.qlogo.cn/mmopen/vi_32/ceXE8MaLuaThTbb3hibXvcoq6q3tt7APnP5GicHY6caYkYa86sVBMhH7JKQJICfWlsD4PTWlM3iaKXjdoM5gp1Ddg/96");
}
public void SetOnlineTexture(string mUrl)
{
Action<bool,Texture2D> handle = (bool mIsSuccess, Texture2D mSetupTexture) =>
{
if (mIsSuccess)
{
mImage.texture = mSetupTexture;
}
else
{
//TODO 加载失败处理
}
};
Texture2D mTexture;
if (TryGetImageInCache(mUrl, out mTexture))
{
handle(true, mTexture);
}
else
{
StartCoroutine(DownLoadImages(mUrl, handle));
}
}
IEnumerator DownLoadImages(string mUrl, Action<bool, Texture2D> mCallBack)
{
WWW www = new WWW(mUrl);
while (!www.isDone)
{
yield return null;
}
if (string.IsNullOrEmpty(www.error))
{
UpdateImageInCache(mUrl, www.texture);
mCallBack(true, www.texture);
}
else
{
mCallBack(false, null);
}
www.Dispose();
yield return null;
}
public static bool TryGetImageInCache(string mPath, out Texture2D mTexture)
{
return mImageCacheDict.TryGetValue(mPath, out mTexture);
}
public static void UpdateImageInCache(string mPath, Texture2D mTexture)
{
if (mImageCacheDict.ContainsKey(mPath))
{
mImageCacheDict[mPath] = mTexture;
}
else
{
mImageCacheDict.Add(mPath, mTexture);
}
}
}