求助一个canvas的问题..

llller 2015-09-10 08:37:31
先贴源码:

@Override
protected void onDraw(Canvas canvas) {
RectF rectF = new RectF(0, 0, getWidth(), getHeight());
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.YELLOW);
paint.setStyle(Style.FILL_AND_STROKE);

Path path = new Path();
path.moveTo(0, 0);
path.lineTo(getWidth(), getHeight());
path.lineTo(getWidth(), 0);
path.lineTo(0, 0);
path.close();

canvas.drawPath(path, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
Path rPath = new Path();
rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
canvas.drawPath(rPath, paint);
}


这是效果:



现在的问题是右上角的怎么会是黑色的...?????

谢谢...
...全文
223 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
llller 2015-09-16
  • 打赏
  • 举报
回复
引用 15 楼 u013377714 的回复:
[quote=引用 14 楼 j68205150 的回复:] 解决了... 先saveLayerAlpha一下.... 最后在restore...就ok了...
为什么我还是不行,发下代码。。。[/quote]

    protected void onDraw(Canvas canvas)
    {
    	canvas.saveLayerAlpha(0, 0, getWidth(), getHeight(), 255, Canvas.ALL_SAVE_FLAG);
    	
    	RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.YELLOW);
        paint.setStyle(Style.FILL_AND_STROKE);
         
        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(getWidth(), 0);
        path.lineTo(0, 0);
        path.close();
         
        canvas.drawPath(path, paint);
         
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);
		
		canvas.restore();
		
    }
水的川 2015-09-16
  • 打赏
  • 举报
回复
引用 16 楼 j68205150 的回复:
[quote=引用 15 楼 u013377714 的回复:] [quote=引用 14 楼 j68205150 的回复:] 解决了... 先saveLayerAlpha一下.... 最后在restore...就ok了...
为什么我还是不行,发下代码。。。[/quote]

    protected void onDraw(Canvas canvas)
    {
    	canvas.saveLayerAlpha(0, 0, getWidth(), getHeight(), 255, Canvas.ALL_SAVE_FLAG);
    	
    	RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.YELLOW);
        paint.setStyle(Style.FILL_AND_STROKE);
         
        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(getWidth(), 0);
        path.lineTo(0, 0);
        path.close();
         
        canvas.drawPath(path, paint);
         
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);
		
		canvas.restore();
		
    }
[/quote]突然发现你那圆形头像都是两层canvas。。
水的川 2015-09-15
  • 打赏
  • 举报
回复
引用 14 楼 j68205150 的回复:
解决了... 先saveLayerAlpha一下.... 最后在restore...就ok了...
为什么我还是不行,发下代码。。。
llller 2015-09-14
  • 打赏
  • 举报
回复
解决了... 先saveLayerAlpha一下.... 最后在restore...就ok了...
llller 2015-09-14
  • 打赏
  • 举报
回复
引用 12 楼 u013377714 的回复:
引用 11 楼 j68205150 的回复:
[quote=引用 9 楼 u013377714 的回复:] [quote=引用 8 楼 j68205150 的回复:] [quote=引用 6 楼 u013377714 的回复:] [quote=引用 5 楼 u014165119 的回复:] [quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 是啊... 我把绘制顺序反过来...用SRC_IN... 结果变成了一块黑色方形... 郁闷... 我其他的自定义控件都用了setXfermode..而且都正常...就这一个控件有问题...[/quote]你其它的自定义控件发一个给我看下。。[/quote]

			Bitmap temp = Bitmap.createBitmap(getWidth(), getWidth(),
					Config.ARGB_4444);
			
			Paint p = new Paint();
			p.setAntiAlias(true);
			p.setFilterBitmap(true);
			
			Canvas canvas = new Canvas(temp);

			canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2, p);

			p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

			// 按比例缩放
			float scale_w = (float) getWidth() / source.getWidth();
			float scale_h = (float) getHeight() / source.getHeight();
			Matrix m = new Matrix();
			m.postScale(scale_w, scale_h);
			canvas.setMatrix(m);
			canvas.drawBitmap(source, 0, 0, p);

			c.drawBitmap(temp, 0, 0, null);
这是画个圆形的头像... 可以正常使用...[/quote]你没发现两者的区别吗?第二个是背景+绘制在上面的颜色。而第一个是背景+三角形+圆角矩形,然后你再看下http://blog.csdn.net/edisonlg/article/details/7084977这个,它只是两个图像之间的截取而不是3个。。。[/quote] 是一样的....你试试...
水的川 2015-09-13
  • 打赏
  • 举报
回复
引用 11 楼 j68205150 的回复:
引用 9 楼 u013377714 的回复:
[quote=引用 8 楼 j68205150 的回复:] [quote=引用 6 楼 u013377714 的回复:] [quote=引用 5 楼 u014165119 的回复:] [quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 是啊... 我把绘制顺序反过来...用SRC_IN... 结果变成了一块黑色方形... 郁闷... 我其他的自定义控件都用了setXfermode..而且都正常...就这一个控件有问题...[/quote]你其它的自定义控件发一个给我看下。。[/quote]

			Bitmap temp = Bitmap.createBitmap(getWidth(), getWidth(),
					Config.ARGB_4444);
			
			Paint p = new Paint();
			p.setAntiAlias(true);
			p.setFilterBitmap(true);
			
			Canvas canvas = new Canvas(temp);

			canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2, p);

			p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

			// 按比例缩放
			float scale_w = (float) getWidth() / source.getWidth();
			float scale_h = (float) getHeight() / source.getHeight();
			Matrix m = new Matrix();
			m.postScale(scale_w, scale_h);
			canvas.setMatrix(m);
			canvas.drawBitmap(source, 0, 0, p);

			c.drawBitmap(temp, 0, 0, null);
这是画个圆形的头像... 可以正常使用...[/quote]你没发现两者的区别吗?第二个是背景+绘制在上面的颜色。而第一个是背景+三角形+圆角矩形,然后你再看下http://blog.csdn.net/edisonlg/article/details/7084977这个,它只是两个图像之间的截取而不是3个。。。
llller 2015-09-13
  • 打赏
  • 举报
回复
引用 9 楼 u013377714 的回复:
引用 8 楼 j68205150 的回复:
[quote=引用 6 楼 u013377714 的回复:] [quote=引用 5 楼 u014165119 的回复:] [quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 是啊... 我把绘制顺序反过来...用SRC_IN... 结果变成了一块黑色方形... 郁闷... 我其他的自定义控件都用了setXfermode..而且都正常...就这一个控件有问题...[/quote]你其它的自定义控件发一个给我看下。。[/quote]

			Bitmap temp = Bitmap.createBitmap(getWidth(), getWidth(),
					Config.ARGB_4444);
			
			Paint p = new Paint();
			p.setAntiAlias(true);
			p.setFilterBitmap(true);
			
			Canvas canvas = new Canvas(temp);

			canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2, p);

			p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

			// 按比例缩放
			float scale_w = (float) getWidth() / source.getWidth();
			float scale_h = (float) getHeight() / source.getHeight();
			Matrix m = new Matrix();
			m.postScale(scale_w, scale_h);
			canvas.setMatrix(m);
			canvas.drawBitmap(source, 0, 0, p);

			c.drawBitmap(temp, 0, 0, null);
这是画个圆形的头像... 可以正常使用...
水的川 2015-09-13
  • 打赏
  • 举报
回复
引用 7 楼 u014165119 的回复:
引用 6 楼 u013377714 的回复:
[quote=引用 5 楼 u014165119 的回复:] [quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 注意黑色部分不是重叠的,黄色部分才是。[/quote]我知道啊,关键是为什么啊,博客里说明的应该是背景色啊。
水的川 2015-09-13
  • 打赏
  • 举报
回复
引用 8 楼 j68205150 的回复:
引用 6 楼 u013377714 的回复:
[quote=引用 5 楼 u014165119 的回复:] [quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 是啊... 我把绘制顺序反过来...用SRC_IN... 结果变成了一块黑色方形... 郁闷... 我其他的自定义控件都用了setXfermode..而且都正常...就这一个控件有问题...[/quote]你其它的自定义控件发一个给我看下。。
llller 2015-09-13
  • 打赏
  • 举报
回复
引用 6 楼 u013377714 的回复:
引用 5 楼 u014165119 的回复:
[quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 是啊... 我把绘制顺序反过来...用SRC_IN... 结果变成了一块黑色方形... 郁闷... 我其他的自定义控件都用了setXfermode..而且都正常...就这一个控件有问题...
StoneHui_ 2015-09-12
  • 打赏
  • 举报
回复
引用 6 楼 u013377714 的回复:
引用 5 楼 u014165119 的回复:
[quote=引用 4 楼 u013377714 的回复:] [quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。[/quote] 注意黑色部分不是重叠的,黄色部分才是。
StoneHui_ 2015-09-11
  • 打赏
  • 举报
回复
引用 2 楼 u013377714 的回复:
引用 1 楼 u014165119 的回复:
先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
水的川 2015-09-11
  • 打赏
  • 举报
回复
引用 1 楼 u014165119 的回复:
先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
StoneHui_ 2015-09-11
  • 打赏
  • 举报
回复
先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
水的川 2015-09-11
  • 打赏
  • 举报
回复
引用 5 楼 u014165119 的回复:
引用 4 楼 u013377714 的回复:
[quote=引用 3 楼 u014165119 的回复:] [quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗[/quote]可是我看很多博客,比如http://folksy.iteye.com/blog/1488629上面都没有提用这个会变黑,正常来说不是应该就是背景色吗。它是取两个绘制图的重叠部分,并且是取上层图的重叠部分。
StoneHui_ 2015-09-11
  • 打赏
  • 举报
回复
引用 4 楼 u013377714 的回复:
引用 3 楼 u014165119 的回复:
[quote=引用 2 楼 u013377714 的回复:] [quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。[/quote] paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN))这个的效果本来就是那样的,用错了自然实现不了,就像你非要让自行车飞起来,能行吗
水的川 2015-09-11
  • 打赏
  • 举报
回复
引用 3 楼 u014165119 的回复:
引用 2 楼 u013377714 的回复:
[quote=引用 1 楼 u014165119 的回复:] 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
这样也不行。。
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        Path rPath = new Path();
        rPath.addRoundRect(rectF, new float[]{0, 0, 25, 25, 0, 0, 0, 0}, Path.Direction.CCW);
        canvas.drawPath(rPath, paint);

        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(getWidth(), getHeight());
        path.lineTo(0, getHeight());
        path.lineTo(0, 0);
        path.close();

        paint.setColor(Color.WHITE);
        canvas.drawPath(path, paint);

    }
[/quote]我去,他想问的其实是这一句paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));,为什么没能实现,不是像你说的简单地覆盖。。。

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧