円形の反転クリッピングでマスクされたビットマップを描画しようとしています。意図した効果は、円の端からある方向に向かって太陽光線が輝いているように見えるはずです。マスキングは問題なく機能しますが、内側の円を切り取ることはできません。私が見逃しているものはありますか?
これは 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();
}
これはプレビューに表示されているものです。円が中央で切り取られていることがはっきりとわかりますが、これはデバイスでは発生していません。