如何制作一个可绘制的画布

时间:2015-07-06 16:37:41

标签: android svg android-canvas android-drawable

我想在具有固定大小的画布上绘制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);

感谢。

1 个答案:

答案 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()