自定义ViewGroup与循环子
我想实现自定义的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,并启用绘图缓存)
可能最快的方法是让视图直接在画布上绘制(避免创建缓冲区和位图)。
为此,您应该在画布上指定一个剪辑路径和一个设置为适当圆的路径。
然后,画布不会绘制任何绘制在裁剪路径外的东西
ps .:记得在clipPath
后续调用中使用适当的REPLACE
区域