我的资源文件夹中有一些SVG,我需要在我的小部件中动态设置它们(在ImageView上)。
我正在使用此库:http://code.google.com/p/svg-android/
此库返回Picture或PictureDrawable。
我可以看到在RemoteViews上使用的唯一方法是setImageViewBitmap,它显然需要一个位图。
我尝试寻找代码将Drawable转换为这样的位图:
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的大小,并在我知道的情况下设置适当大小的Bitmap。这是最好的方法,我该怎么做?也许有一种我甚至不知道的更好的方法?
答案 0 :(得分:4)
我没有使用过android-svg
但是如果它使用的是vanilla PictureDrawable
,那么它应该只是不使用内在边界的问题。
尝试以下方法:
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的边界设置为完整的画布。
答案 1 :(得分:1)
您是否尝试过createScaledBitmap?
答案 2 :(得分:1)
我已经尝试过svg-android
因为这个原因它并没有为我工作。更不用说其功能受到严重限制。
使用矢量图形的关键是我可以生成任何适当大小的图像以适合UI视图大小。这意味着生成方法必须在运行时接受大小要求,而不是始终使用width
标记中声明的height
,<svg>
。
因此我used原生实现: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);
答案 3 :(得分: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作为平台的一部分。