1

我想实现自定义 ViewGroup,它在里面显示单个 View。棘手的部分是子视图必须裁剪成圆形并且必须快速绘制。

实现此行为的最佳方法是什么?

我当前的实现如下所示:

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    child.setDrawingCacheEnabled(true);
    child.buildDrawingCache();
    child.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    canvas.drawBitmap(getCroppedBitmap(child.getDrawingCache()), outerWidth, outerWidth, new Paint());
    child.setLayerType(View.LAYER_TYPE_NONE, null);
    return true;
}

public Bitmap getCroppedBitmap(Bitmap bitmap) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
            bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    childPaint.setXfermode(null);
    canvas.drawARGB(0, 0, 0, 0);
    canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
            bitmap.getWidth() / 2, childPaint);
    childPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, mBoundsI, mBoundsI, childPaint);
    return output;
}

(每次创建新的 Canvas 和 Bitmap,并启用绘图缓存)

4

1 回答 1

0

实现这一点的最快方法可能是让视图直接在画布上绘制(避免创建缓冲区和位图)。

为此,您应该在画布上指定一个剪辑路径,并将路径设置为适当的圆

然后画布将不会绘制任何在其剪切路径之外绘制的内容

ps.:记得在后续调用中使用相应的REPLACE RegionclipPath

于 2014-06-04T14:25:03.353 回答