Масштабирование холста для изменения размера SVG в Android
мне не очень повезло, оборачивая голову вокруг этого, поэтому я надеюсь, что кто-то может мне помочь.
Я получаю drawable от SVG с помощью svg-android, но 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);
Я также нашел функция, которая создаст масштабированное растровое изображение, но качество изображения значительно снижается, поэтому я могу просто использовать масштабированные PNGs.
очевидно, я что-то упускаю, и мое отсутствие опыта делает это очень расстраивает.
что я как чтобы иметь возможность сделать, это svg-android полностью масштабировать SVG, прежде чем вытащить изображение или PictureDrawable из него, но я не могу понять, как пройти через 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);
Я на правильном пути? Canvas c перезапишет холст по умолчанию (это то, что я хочу), не так ли?
2 ответов
Я понял. Или, по крайней мере, придумал метод, который работает. Ответ смотрел мне в лицо в этой масштабированной растровой функции, которая мне не нравилась. Я принципиально неправильно понял, как работает класс 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);
Я могу размер его на любой вид, который я хочу, получая desiredWidth и desiredHeight из getWidth() и getHeight() вызовов и setBackground (vectorDrawing) в конце, чтобы поместить его на Вид.
у меня была аналогичная проблема и вот что я узнал и как я ее решал. Сначала я попытался отобразить 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, измените это в коде позже. Существует также ответ в