缩放canvas以调整Android中的SVG大小

我没有太多的运气,因此我希望有人能帮助我。

我从SVG使用svg-android获取drawable,但drawable不缩放到视图。 我所能find的所有东西都说我应该直接绘制canvas并重新调整canvas,但是当我尝试这样做时,它似乎只是改变边界而不是缩放图像。

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

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); 

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

很明显,我错过了一些东西,而我缺乏经验让它感到非常沮丧。

我希望能够做的是让svg-android在将Picture或PictureDrawable拉出来之前完全重新缩放SVG,但是我无法弄清楚如何逐步通过SVGParser,并且每次都运行乘法器无论如何,坐标对可能是超级资源密集型的。

是唯一的方法来缩放和重新绘制图片,并将其分配给视图来创build自定义视图并重写OnDraw?

 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); 

我在正确的轨道上? canvasc会覆盖默认的canvas(这是我想要的),不是吗?

Solutions Collecting From Web of "缩放canvas以调整Android中的SVG大小"

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

代码,似乎已经把它closures:

 //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,最后将setBackground(vectorDrawing)放在视图上,从而将其大小调整为任意视图。

我有一个类似的问题,这是我学到了什么,我是如何解决它的。 首先,我尝试将我的svg直接渲染到canvas上

 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中也有一个答案,他们build议删除这些属性。 所以我改变了

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

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

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

我得到左上angular在(0,0)和右下angular在(1200,696)resize的宽度为200的框的内容。您可以更改比例初始比率的行为。 请注意,可以忽略SVG中的width,heigth和ViewBox,并以编程方式设置ViewBox

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

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