我没有太多运气包围我的头,所以我希望有人可以帮助我。
我使用svg-android从SVG获得了一个drawable,但是drawable没有缩放到视图中。我能找到的所有内容都说我应该直接绘制画布并重新缩放画布,但是当我尝试它时,它似乎只是改变了界限而不是缩放图像。
这是我到目前为止所尝试的:
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,并且在每个坐标对上运行乘数也可能是超级资源密集的。
[edit]是缩放和重新绘制图片并将其分配给视图以创建自定义视图和覆盖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);
我是否在正确的轨道上?画布c会覆盖默认画布(这就是我想要的),不是吗?
答案 0 :(得分: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以及最后将setBackground(vectorDrawing)放在View上来将其调整为我想要的任何视图。
答案 1 :(得分: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中的width,heigth和ViewBox,并以编程方式设置ViewBox
svg.setDocumentViewBox(0,0,width,height);
要了解有关ViewBox属性的更多信息,请参阅W3ViewBox。