差异剪切无法按预期工作

时间:2012-12-05 00:51:31

标签: android graphics

我正在尝试绘制带有圆形倒置剪辑的蒙版位图。预期的效果应该看起来像太阳光线从圆的边缘向一个方向发光。 屏蔽效果很好,但剪掉内圈不起作用。有什么东西我错过了吗?

这是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();

}

这就是预览显示的内容,可以清楚地看到圆圈在中间切出,但这并不是设备上的恭喜:

enter image description here

0 个答案:

没有答案
相关问题