3

我正在编写一个应用程序,其唯一目的是定期下载一些图像并将它们显示在动态磁贴中。我希望能够每三十分钟左右用 4-8 张图像更新磁贴,所以我需要使用 CycleTile。下载图像并将它们放入实时磁贴非常简单。真正的踢球者是在每个图像上添加文本。

如果只是两张图片,我会使用翻转瓷砖,一张在正面,一张在背面。然后我会通过为正面和背面分配不同的磁贴标题来添加文本。但是,由于我需要显示 2 张以上的图像,因此我需要使用 CycleTile。这种方法不适用于 CycleTile。(但如果我错了,请纠正我!)

所以我的下一个想法是在 WriteableBitmap 上覆盖一个 TextBlock。这可以工作,但我认为考虑到以下因素,它会很快变得复杂:不同的图像分辨率、中/大瓷砖布局和不同的屏幕 PPI。我敢肯定我能弄明白,但它似乎……很乱。

有一个更好的方法吗?我忽略了一些 Tile 功能吗?

总结一下我的要求是:

  1. 使用动态磁贴显示 4-8 张图像。
  2. 每个图像都需要有一些与之关联的文本。
  3. 每三十分钟左右更新一次图像。
  4. 需要扩展到宽瓷砖。
  5. 需要扩展到具有更高 PPI 屏幕的手机。
4

1 回答 1

4

对于第一项,您应该能够使用WriteableBitmapEx项目中的 Blit 方法将尽可能多的图像合并在一起。由于您可以以任何您想要的方式将图像合并在一起,因此您可以确保它们覆盖宽平铺宽度和您需要的任何 ppi。

为了覆盖第二项,以下内容将覆盖图像上的文本:

private static ImageSource createBitmapImageWithImage(string text, int x, int y, Color textColor, BitmapSource bitmapSource)
{
    using(var mem = new MemoryStream())
    {
        //Create Formatted Text
        var textBlock = new TextBlock
            {
                Text = text,
                Foreground = new SolidColorBrush(textColor),
                FontFamily = new FontFamily("Courier New"),
                FontSize = 40
            };

        //Moves an object two dimensionally
        var tf = new TranslateTransform
            {
                X = x,
                Y = y
            };

        //Overlay text on existing image
        var bmpImage = new WriteableBitmap(bitmapSource);
        bmpImage.Render(textBlock, tf);
        bmpImage.Invalidate();

        //Convert back into bitmap
        bmpImage.SaveJpeg(mem, bmpImage.PixelWidth, bmpImage.PixelHeight, 0, 100);
        mem.Seek(0, SeekOrigin.Begin);
        var image = new BitmapImage();
        image.SetSource(mem);

        return image;
    }
}

当然你也可以传入文本块,或者配置文本块的选项。但我想展示如何根据需要设置文本格式。

您的第三个请求包含在后台任务中。在您的手机解决方案中,添加一个新项目,您可以选择后台任务。让这个调用你的代码来更新图像是相当简单的。诺基亚甚至创建了一个关于如何添加代码示例的演练

于 2013-06-15T05:48:32.327 回答