标签: porter-duff

PorterDuff和Path

在我的项目中,我有一个位图填充整个屏幕.在这个位图上,我绘制了一个路径

android.graphics.Canvas.drawPath(Path path, Paint paint)
Run Code Online (Sandbox Code Playgroud)

设置绘画以便描边和填充路径的内容.我将实现的是擦除与路径相交的bitamp部分.我设法使用另一个bitmmap而不是路径,并使用porter duff规则获得相同的行为.有没有机会对路径做同样的事情?

    mPaintPath.setARGB(100, 100, 100, 100);// (100, 100, 100, 100)
    mPaintPath.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaintPath.setAntiAlias(true);
    mPath.moveTo(x0, y0));
    mPath.lineTo(x1, y1);
    mPath.lineTo(x2, y2);
    mPath.lineTo(x3, y3);
    mPath.lineTo(x0, y0);
    mPath.close();
    c.drawPath(mPath, mPaintPath);
Run Code Online (Sandbox Code Playgroud)

android drawing porter-duff

4
推荐指数
1
解决办法
2067
查看次数

PorterDuffXfermode DST_IN无法按预期工作

所以我试图加快一些我们正在做的绘图(用alpha透明度绘制弧的一部分)并尝试将整个弧缓存到单独的位图中,并选择性地使用alpha蒙版显示它.

从我已经完成的研究(Android的Xfermodes API演示,此示例此工具),如果我有以下两个图形:

在此输入图像描述

在此输入图像描述

并使用以下内容绘制:

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);
Run Code Online (Sandbox Code Playgroud)

我应该得到这个结果:

在此输入图像描述

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

我也确保为这个视图禁用硬件渲染,以防这个Xfermode出现问题,但它没有什么区别.

我把它分解成一个单独的项目,在最简单的级别试图让它工作,并使用下面的代码,我仍然有同样的问题:

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) { …
Run Code Online (Sandbox Code Playgroud)

java android drawing masking porter-duff

4
推荐指数
1
解决办法
5001
查看次数

画布中的Android橡皮擦不会擦除

我有以下代码来激活/停用橡皮擦:

public PorterDuffXfermode clear = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);    
eraseB.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        if (!eraser) {
                            eraser = true;
                            eraseB.setImageResource(R.drawable.erase_on);
                            paint = new Paint(Paint.DITHER_FLAG);
                            paint.setColor(0x00000000);
                            paint.setAlpha(0x00);
                            paint.setXfermode(clear);
                            paint.setStyle(Paint.Style.STROKE);
                            paint.setStrokeJoin(Paint.Join.ROUND);
                            paint.setStrokeCap(Paint.Cap.ROUND);
                            paint.setStrokeWidth(stroke);
                            paintv.setPaint(paint);
                        } else {
                            eraser = false;
                            eraseB.setImageResource(R.drawable.erase);
                            paint = new Paint(Paint.DITHER_FLAG);
                            paint.setDither(true);
                            paint.setXfermode(null);
                            paint.setColor(Color.RED);
                            paint.setStyle(Paint.Style.STROKE);
                            paint.setStrokeJoin(Paint.Join.ROUND);
                            paint.setStrokeCap(Paint.Cap.ROUND);
                            paint.setStrokeWidth(stroke);
                            paintv.setPaint(paint);
                        }
                    }
                });
Run Code Online (Sandbox Code Playgroud)

setPaint来自我的customView:

public void setPaint(Paint paint) {
    this.paint = paint;
    LogService.log("in setPaint", "paint = " + paint);
}
Run Code Online (Sandbox Code Playgroud)

和onDraw我用:

canvas.drawPath(mPath, paint);
Run Code Online (Sandbox Code Playgroud)

如果我停用橡皮擦,它将用红线绘制,但相反,如果我激活橡皮擦,而不是擦除,它将绘制一条黑线.我怎样才能解决这个问题

android canvas paint erase porter-duff

2
推荐指数
1
解决办法
3708
查看次数

Android Scratch卡应用

我正在为大学做一个小项目,并想知道是否有人可以告诉我如何做一个刮刮卡应用程序.这个应用程序应该有一个图像覆盖另一个 顶部的那个应该允许用户根据它们在图像上摩擦的位置来移除图像,因此移除的图像的一部分显示下面的图像.非常像刮刮卡.任何帮助都会很棒!

这是我目前正在使用的代码.

            public class workinggraphics extends Activity 
 {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);
    setContentView(new Panel(this));

    LinearLayout l1 = (LinearLayout) findViewById(R.id.LAYOUTTEST1);
    Panel p1 = new Panel(null);
}

    class Panel extends View{

        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath;
        private Paint   mPaint;
    //  private Paint nPaint;
        Bitmap bitmap;
        Canvas pcanvas ;
        int x = 0;
        int y =0;
        int r =0;
        public Panel(Context context) {
            super(context);

            Log.v("Panel", …
Run Code Online (Sandbox Code Playgroud)

java android paint panels porter-duff

1
推荐指数
1
解决办法
4649
查看次数

标签 统计

android ×4

porter-duff ×4

drawing ×2

java ×2

paint ×2

canvas ×1

erase ×1

masking ×1

panels ×1