我应该为图像和颜色使用公共静态字段吗?

时间:2016-08-04 15:31:42

标签: c# ios static xamarin.ios public-fields

我有一个公共静态方法,它返回一个颜色替换图像(我传入一个黑色图像,它返回相同的图像,红色而不是黑色,或我选择的任何颜色)。

看起来像这样:

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应用。这样做有问题吗?认为它甚至可能使我们的一些列表视图加载更快,因为它们不是一遍又一遍地抓取图像并处理它们的颜色。

2 个答案:

答案 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)

我认为将不必要的数据加载到内存中没有任何意义。 你打算做的是为你想到的每种颜色创建一个图像,如果用户将选择那种特定的颜色,它就可以使用了。

如果你正在构建一个服务器模块,它的视角有点不同,但只要有一个用户选择颜色,你应该做的唯一事情是绘制它,用图像初始化数组有什么意义?

它只是爆炸你的记忆,因为用户可能会选择这种颜色..