我想在具有固定大小的画布上绘制Drawable。
问题在于drawable在画布上绘制了它的内在和高度,并没有占用所有空间。
我想让drawable填充画布中的所有空间,就像在ImageView中一样。
所以我看了一下ImageView的源代码,看到使用了这个矩阵,我在下面试过但是drawable仍然是在左上角绘制的,具有它的内在大小。
有关信息,我的drawable是一个PictureDrawable,是根据来自SVG文件的图片创建的。
Bitmap bitmap = Bitmap.createBitmap(fSize, fSize, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Drawable drawable = svg.createPictureDrawable();
float scale = Math.min((float) fSize / (float) drawable.getIntrinsicWidth(),
(float) fSize / (float) drawable.getIntrinsicHeight());
Matrix matrix = new Matrix();
matrix.setScale(scale, scale);
canvas.setMatrix(matrix);
drawable.draw(canvas);
感谢。
答案 0 :(得分:4)
您可以将SVG
呈现给Picture
,然后将其直接呈现给Canvas
,其中包含以下内容:
public Bitmap renderToBitmap(SVG svg, int requiredWidth){
if(requiredWidth < 1) requiredWidth = (int)svg.getIntrinsicWidth();
float scaleFactor = (float)requiredWidth / (float)svg.getIntrinsicWidth();
int adjustedHeight = (int)(scaleFactor * svg.getIntrinsicHeight());
Bitmap bitmap = Bitmap.createBitmap(requiredWidth, adjustedHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawPicture(svg.getPicture(), new Rect(0, 0, requiredWidth, adjustedHeight));
return bitmap;
}
上述方法将使用宽度作为缩放因子来保留纵横比。如果将小于1的值传递给方法(标记为fSize的值),则在生成Bitmap
时将使用图像的固有宽度。
修改:对于使用AndroidSVG代替svg-android的任何人(就像我在上面使用的假设一样),只需替换所有以前出现的{{{ 1}}分别带有getIntrinsicWidth(), getIntrinsicHeight(), and getPicture()
。