我正在尝试绘制带有圆形倒置剪辑的蒙版位图。预期的效果应该看起来像太阳光线从圆的边缘向一个方向发光。 屏蔽效果很好,但剪掉内圈不起作用。有什么东西我错过了吗?
这是ImageView的onDraw方法,带有额外的掩码位图。使用此代码在eclipse ADT工具中预览视图时效果非常好(Xfermode除外,预览中不支持),但在设备上裁剪被忽略。
@Override
protected void onDraw(Canvas canvas) {
if (originalBounds == null) {
originalBounds = new Rect();
getDrawingRect(originalBounds);
maskDrawable.setBounds(originalBounds);
maskBitmap = drawableToBitmap(maskDrawable, getWidth(),
getHeight(), Config.ARGB_8888);
bitmap = drawableToBitmap(getDrawable(), getWidth(), getHeight(),
Config.ARGB_8888);
}
if (clipPath == null && clipPathRadius != 0) {
clipPath = new Path();
clipPath.addCircle(originalBounds.exactCenterX(),
originalBounds.exactCenterY(), clipPathRadius,
Path.Direction.CCW);
}
canvas.saveLayer(originalBounds.left, originalBounds.top,
originalBounds.right, originalBounds.bottom, null,
Canvas.MATRIX_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
| Canvas.CLIP_SAVE_FLAG
| Canvas.CLIP_TO_LAYER_SAVE_FLAG);
if (clipPath != null) {
canvas.clipPath(clipPath, Op.DIFFERENCE);
}
paint.setXfermode(null);
canvas.drawBitmap(bitmap, null, originalBounds, paint);
paint.setXfermode(xfermode);
canvas.saveLayer(originalBounds.left, originalBounds.top,
originalBounds.right, originalBounds.bottom, paint,
Canvas.MATRIX_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
| Canvas.CLIP_SAVE_FLAG
| Canvas.CLIP_TO_LAYER_SAVE_FLAG);
paint.setXfermode(null);
canvas.rotate(maskRotation, originalBounds.exactCenterX(),
originalBounds.exactCenterY());
if (clipPath != null) {
canvas.clipPath(clipPath, Op.DIFFERENCE);
}
canvas.drawBitmap(maskBitmap, null, originalBounds, paint);
canvas.rotate(0, originalBounds.exactCenterX(),
originalBounds.exactCenterY());
canvas.restore();
canvas.restore();
}
这就是预览显示的内容,可以清楚地看到圆圈在中间切出,但这并不是设备上的恭喜: