将图片设置为RemoteViews

时间:2013-02-24 12:20:39

标签: android svg bitmap imageview drawable

我的资源文件夹中有一些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。这是最好的方法,我该怎么做?也许有一种我甚至不知道的更好的方法?

4 个答案:

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

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作为平台的一部分。