如何使可绘制对象适合 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(),分别