4

我的资产文件夹中有一些 SVG,我需要在我的小部件(在 ImageView 上)中动态设置它们。

我正在使用这个库:http ://code.google.com/p/svg-android/

这个库返回一个 Picture 或 PictureDrawable。

我可以看到在 RemoteViews 上使用的唯一方法是 setImageViewBitmap,它显然需要一个位图。

我尝试寻找将 Drawable 转换为 Bitmap 的代码,如下所示:

PictureDrawable pictureDrawable = svg.createPictureDrawable();
Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
canvas.drawPicture(pictureDrawable.getPicture()); 
currentBitmap = bitmap;

但是位图太小了。当我在 Illustrator 中创建位图时,我将画板大小设置为 65,这是内在宽度/高度上的值。

我的小部件可以调整大小,因此 ImageView 大小是可变的。即使我将宽度和高度静态设置为像这样的大数字......

 Bitmap bitmap = Bitmap.createBitmap(300, 300, Config.ARGB_8888); 

然后生成的位图在一个小图像的下方和右侧只有一堆空白。

我想我需要以某种方式以放大的值绘制图片以及创建大小为 300 的位图。理想情况下,我可以在运行时计算出 ImageView 的大小并设置适当大小的位图(如果我知道的话)。这是最好的方法吗?我该怎么做?也许有更好的方法我什至不知道?

4

4 回答 4

4

我没有使用过android-svg,但如果它使用 vanilla PictureDrawables,那么它应该只是不使用内在界限的问题。

尝试以下操作:

PictureDrawable pictureDrawable = svg.createPictureDrawable();
Bitmap bitmap = Bitmap.createBitmap(300, 300, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
pictureDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
pictureDrawable.draw(canvas); // do not access the Picture directly, that defeats the purpose
currentBitmap = bitmap;

简而言之,使用 Drawable 而不是它的 Picture 并将 Drawable 的边界设置为整个画布。

于 2013-02-26T15:34:25.660 回答
1

您是否尝试过 createScaledBitmap?

createScaledBitmap()

于 2013-02-26T14:54:26.873 回答
1

我已经尝试过svg-android,但出于这个原因,它对我没有用。更不用说其严重受限的功能集了。

使用矢量图形的目的是我可以生成任何合适大小的图像以适应 UI 视图大小。这意味着生成方法必须在运行时接受大小要求,而不是总是使用标签widthheight声明的。<svg>

因此,我使用了本机实现:libsvg-android,正是这样做的。

它直接呈现给给定大小的画布:

long objId = SvgRaster.svgAndroidCreate();
SvgRaster.svgAndroidParseBuffer(objId, readString(mInputStream, "UTF-8"));
SvgRaster.svgAndroidSetAntialiasing(objId, true);
SvgRaster.svgAndroidRenderToArea(objId, mCanvas, 0, 0, mWidth, mHeight);
于 2013-03-02T07:58:40.057 回答
1

我最终将基础画板大小修改为 300。放大方法都不起作用。所以我使用的最终代码是我最初发布的代码:

PictureDrawable pictureDrawable = svg.createPictureDrawable();
Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
canvas.drawPicture(pictureDrawable.getPicture()); 
currentBitmap = bitmap;

一旦我有了一个 300x300 位图,我就可以使用 setImageViewBitmap 将它设置到 RemoteViews 中。

这种首先破坏了使用 SVG 的目的(至少就在小部件中使用它们而言)。

我的问题与 User117 不同。也许他没有按照图书馆的要求将外层命名为“边界”。无论哪种方式,我都设法让库正常工作,尽管必须修改 SVG 画板大小。

希望随着屏幕分辨率的提高,Android 将很快将 SVG 作为平台的一部分引入。

于 2013-03-17T09:10:23.593 回答