我有一个公共静态方法,它返回一个颜色替换图像(我传入一个黑色图像,它返回相同的图像,红色而不是黑色,或我选择的任何颜色)。
看起来像这样:
public class ColorImage
{
public static UIImage GetColoredImage(UIImage image, UIColor color)
{
UIImage coloredImage = null;
if (color == null)
{
color = UIColor.FromRGB(44, 132, 248);
}
UIGraphics.BeginImageContextWithOptions(image.Size, false, UIScreen.MainScreen.Scale);
using (CGContext context = UIGraphics.GetCurrentContext())
{
context.TranslateCTM(0, image.Size.Height);
context.ScaleCTM(1.0f, -1.0f);
var rect = new RectangleF(0, 0, (float)image.Size.Width, (float)image.Size.Height);
context.ClipToMask(rect, image.CGImage);
context.SetFillColor(color.CGColor);
context.FillRect(rect);
coloredImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
}
return coloredImage;
}
}
我正在和一位同事交谈,我们认为最好存储图像(颜色而不是颜色),以及我们计划在公共静态字段中使用的颜色。这样,如果我需要使用其中一种颜色或图像,我可以调用:
Textfield.BackgroundColor = ColorCache.MainColor;
Textfield.Image = ImageCache.UserImage;
或者那些东西。这适用于使用Xamarin的iOS应用。这样做有问题吗?认为它甚至可能使我们的一些列表视图加载更快,因为它们不是一遍又一遍地抓取图像并处理它们的颜色。
答案 0 :(得分:1)
不是像静态一样一次性加载所有内容,更好的方法是使用缓存。因此,一旦加载的图像将被保存在存储器中,并且在下次要求时不会被创建。但是尚未被问到的图像不会占用任何记忆。
您可以使用普通属性或静态属性。
或者创建一个私有的只读字典,其中包含颜色名称和图像作为键和值。如果在请求时键可用则返回,否则创建并添加到词典并返回图像。
一些示例代码:
public static class ColorImage
{
private static readonly Dictionary<UIColor, UIImage> _colorDictionary = new Dictionary<UIColor, UIImage>();
public static UIImage GetColoredImage(UIImage image, UIColor color)
{
if(_colorDictionary.ContainsKey(color))
{
_colorDictionary.TryGetValue(color, out image);
}
else
{
//create the image
_colorDictionary.Add(color, image);
}
return image;
}
}
答案 1 :(得分:0)
我认为将不必要的数据加载到内存中没有任何意义。 你打算做的是为你想到的每种颜色创建一个图像,如果用户将选择那种特定的颜色,它就可以使用了。
如果你正在构建一个服务器模块,它的视角有点不同,但只要有一个用户选择颜色,你应该做的唯一事情是绘制它,用图像初始化数组有什么意义?
它只是爆炸你的记忆,因为用户可能会选择这种颜色..