10

我没有太多的运气来解决这个问题,所以我希望有人可以帮助我。

我正在使用 svg-android 从 SVG 获取可绘制对象,但可绘制对象没有缩放到视图。我能够找到的所有内容都表明我应该直接绘制到画布并重新缩放画布,但是当我尝试时它似乎只改变了边界而不是缩放图像。

这是我迄今为止尝试过的:

ImageView testview = (ImageView)findViewById(R.id.testview);

//Get SVG and convert to drawable
SVG vector = SVGParser.getSVGFromResource(getResources(),R.drawable.testvector);
Drawable test = vector.createPictureDrawable();

testview.setBackground(test);  //displays fine, but won't scale to the dimensions of
                               //the View

//function that clips the image but doesn't scale:
Drawable testTwo = new CustomPictureDrawable(vector.getPicture(), 
(float)0.5, (float)0.5);

testView.setBackground(testTwo);

class CustomPictureDrawable extends PictureDrawable {
   private float scalex, scaley;

public CustomPictureDrawable(Picture picture, float scalex, float scaley) {
    super(picture);
    this.scalex = scalex;
    this.scaley = scaley;
}

@Override
public void draw(Canvas canvas) {
    Matrix original = canvas.getMatrix();
    canvas.scale(scalex, scaley);
    super.draw(canvas);
    canvas.setMatrix(original);
}
}

//doesn't display anything
Picture testThree = vector.getPicture();

Bitmap b = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_4444);
Canvas c = new Canvas(b);

c.drawPicture(testThree, new Rect(0,0,10,10));

testview.draw(c);

我还发现了一个可以创建缩放位图的函数,但是图像质量显着降低,所以我不妨只使用缩放的 PNG。

显然我错过了一些东西,而我缺乏经验让这真的很令人沮丧。

我想做是让 svg-android 在从中拉出 Picture 或 PictureDrawable 之前完全重新缩放 SVG,但我不知道如何逐步通过 SVGParser,并在每个无论如何,坐标对可能是超级资源密集型的。

[编辑] 是缩放和重新绘制图片并将其分配给视图以创建自定义视图并覆盖 OnDraw 的唯一方法吗?

IE

Picture testThree = vector.getPicture();

Bitmap b = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_4444);
Canvas c = new Canvas(b);

c.drawPicture(testThree, new Rect(0,0,10,10));

//CustomView extends ImageView or Button or whatever with OnDraw overridden and no
//other changes 
CustomView testview = (CustomView)findViewById(R.id.testview); 

testview.OnDraw(c);

我在正确的轨道上吗?Canvas c 会覆盖默认画布(这是我想要的),不是吗?

4

2 回答 2

8

我想到了。或者至少想出了一个可行的方法。答案是在我不喜欢的缩放位图函数中盯着我看。我从根本上误解了 Picture 类和 Draw 调用的工作原理。

似乎已经成功的代码:

//Get a Picture from the SVG
SVG vector = SVGParser.getSVGfromResource(getResources(), R.raw.testvector);

Picture test = vector.getPicture();

//Redraw the picture to a new size
Bitmap bitmap = Bitmap.createBitmap(desired width, desired height, config);

Canvas canvas = new Canvas(bitmap);

Picture resizePicture = new Picture();

canvas = resizePicture.beginRecording(desiredWidth, desiredGeight);

canvas.drawPicture(test, new Rect(0,0,desiredWidth, desiredHeight);

resizePicture.endRecording();

//get a drawable from resizePicture
Drawable vectorDrawing = new PictureDrawable(resizePicture);

我可以通过从 getWidth() 和 getHeight() 调用中获取 desiredWidth 和 desiredHeight 并将其设置为我想要的任何 View 大小,最后通过 setBackground(vectorDrawing) 将其放在 View 上。

于 2013-01-06T07:05:33.580 回答
6

我有一个类似的问题,这就是我学到的以及我如何解决它。首先,我尝试将我的 svg 直接渲染到画布中

svg.renderToCanvas(canv);

没有我想要的尺寸。然后我尝试使用调整图像大小

svg.renderToCanvas(canv,new RectF(0,0,200,200));

svg.setDocumentWidth(200);
svg.renderToCanvas(canv);

但两者都不起作用,所以我开始查看我的 SVG。问题是我的 SVG 是这样开始的

<svg width="66.3679625" height="100.4148375" xmlns="http://www.w3.org/2000/svg">

一旦在 svg 中设置了宽度和高度,之后在代码中更改它似乎是不可能的。AndroidSvgFAQ中也有一个答案,他们建议删除这些属性。所以我把它改成了

 <svg version="1.1" viewBox="0 0 1280 696" xmlns="http://www.w3.org/2000/svg">

viewBox 属性是我的 SVG 图片的框架,所以如果现在我使用上面的代码

svg.setDocumentWidth(200);
svg.renderToCanvas(canv);

我得到左上角为 (0,0) 和右下角为 (1200,696) 的框的内容,调整大小以使宽度为 200。您可以更改比率的行为,它最初保持比率。请注意,可以在 SVG 中省略宽度、高度和 ViewBox,并以编程方式设置 ViewBox

svg.setDocumentViewBox(0,0,width,height);

要了解有关 ViewBox 属性的更多信息,请参阅W3ViewBox

于 2015-01-13T23:25:00.603 回答