首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PorterDuffXfermode DST_IN未按预期工作

PorterDuffXfermode DST_IN未按预期工作
EN

Stack Overflow用户
提问于 2012-12-01 06:50:13
回答 1查看 6.1K关注 0票数 6

因此,我正在尝试加速我们正在进行的一些绘制(绘制具有alpha透明度的弧线的一部分),并尝试将整个弧线缓存到一个单独的位图中,并使用alpha蒙版选择性地显示它。

根据我所做的研究(针对Android、this examplethis tool的Xfermodes API演示),例如,如果我有以下两个图形:

并使用以下内容进行绘制:

代码语言:javascript
复制
Xfermode DST_IN = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

canvas.drawBitmap(circle, 0, 0, paint);
paint.setXfermode(DST_IN);
canvas.drawBitmap(arc, 0, 0, paint);
paint.setXfermode(null);

我应该得到这样的结果:

目标图像(圆)被裁剪到绘制源图像(圆弧)的区域。相反,我得到了完整的圆圈。如果我只是绘制圆弧,它会出现在正确的位置,如果我使用DST_OUT,我会得到预期结果的倒数(圆的其他三个象限)。

我还确保禁用此视图的硬件渲染,以防此Xfermode出现问题,但这并没有什么不同。

我在最简单的层次上把它分解到一个单独的项目中,试图让它工作,使用以下代码,我仍然有相同的问题:

代码语言:javascript
复制
public class ClippedView extends View {
    private Xfermode DST_IN, DST_OUT;
    private Paint paint;

    public ClippedView(Context context) {
        super(context);
        init();
    }

    private void init() {
        setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        DST_IN = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
        DST_OUT = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.GREEN);
        canvas.drawRect(0, 0, getWidth() / 2, getHeight() / 2, paint);
        paint.setColor(Color.BLACK);
        paint.setXfermode(DST_IN);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, paint);
        paint.setXfermode(null);
    }
}

我用错了吗?我是不是错过了什么?我发现错误了吗?:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-01 08:44:16

有一种更便宜、更简单的方法来实现这一点:使用裁剪。Canvas.clipRect()就足够了。您的解决方案消耗了大量的填充率。您可以通过使用SRC_IN代替DST_IN来获得您想要的效果。但要小心:它只能在透明的位图或图层中工作。当您直接在屏幕上绘制时,目标已由窗口背景填充。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13654322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档