如何使可绘制对象适合 canvas
How to make a drawable fits canvas
我想在 canvas 上绘制一个固定大小的 Drawable。
问题是 drawable 将自身绘制在 canvas 上,它具有固有的宽度和高度,并没有占用所有可用的 space。
我想让可绘制对象填充 canvas 中的所有 space,就像在 ImageView 中一样。
所以我查看了 ImageView 源代码,发现使用了矩阵,我在下面进行了尝试,但可绘制对象仍然以其固有大小绘制在左上角。
有关信息,我的可绘制对象是 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);
谢谢。
您可以将 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 instead of svg-android 的人(就像我假设上面使用的那样),只需将所有以前出现的 getIntrinsicWidth(), getIntrinsicHeight(), and getPicture()
替换为getDocumentWidth(), getDocumentHeight(), and renderToPicture()
,分别
我想在 canvas 上绘制一个固定大小的 Drawable。
问题是 drawable 将自身绘制在 canvas 上,它具有固有的宽度和高度,并没有占用所有可用的 space。
我想让可绘制对象填充 canvas 中的所有 space,就像在 ImageView 中一样。
所以我查看了 ImageView 源代码,发现使用了矩阵,我在下面进行了尝试,但可绘制对象仍然以其固有大小绘制在左上角。
有关信息,我的可绘制对象是 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);
谢谢。
您可以将 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 instead of svg-android 的人(就像我假设上面使用的那样),只需将所有以前出现的 getIntrinsicWidth(), getIntrinsicHeight(), and getPicture()
替换为getDocumentWidth(), getDocumentHeight(), and renderToPicture()
,分别