我应该使用公共静态字段来显示图像和颜色吗?
问题描述:
我有一个公共静态方法,返回一个颜色替换图像(我通过一个黑色的图像,并返回相同的图像与红色,而不是黑色,或我选择的任何颜色)。我应该使用公共静态字段来显示图像和颜色吗?
它看起来像这样:
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应用程序。这样做有问题吗?认为它甚至可能会让我们的一些列表视图加载得更快,因为它们不是抓取图像,而是一遍又一遍地处理它们的颜色。
答
我认为将不必要的数据加载到内存没有任何意义。 你打算做的是为你可能想到的每种颜色创建一个图像,如果用户将选择该特定颜色,它将准备好使用。
如果你正在构建一个服务器模块,它有点不同的观点,但只要一个用户选择颜色,并且你应该做的唯一事情就是绘制它,那么使用图像初始化一个数组有什么意义?
它只会爆你的内存,用户可以选择这种颜色的机会..
答
而是在静态加载一次一切都像的,这将是一个更好的方法是使用缓存。因此,一次加载的图像将被保存在内存中,并且在下次请求时不会创建。但是一个尚未被问到的图像将不会占用任何内存。
您可以使用普通属性或静态属性。
或者创建一个私有只读字典,颜色名称和图像作为键和值。如果密钥在请求返回时可用,则它会创建并添加到字典并返回图像。
一些示例代码:
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;
}
}
的图像被用于遍及应用,如在同一图像多次,甚至在同一屏幕上。现在它一次又一次地为图像着色,在列表视图的情况下。我不知道ios是通过使用相同的图像来优化它,还是每次从磁盘抓取图像...我宁愿牺牲图像的少量内存,以获得性能提升 – aufty
,如果这是情况下,在我看来更好的方法是: 创建一个单身人士,每次只有一个图像处理将可用,一旦图像准备好将它保存在Dictionary中,下次单击将被解雇将会寻找那个图像,如果它存在的话就采取它 - 否则,生成一个新图像。 这样,你将永远只拥有“按需”使用的数据,而不仅仅是像轮盘一样创建各种图像。 –
Tomerz