80,472
社区成员




@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);
}
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();
}
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。。@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]
是一样的....你试试...这样也不行。。 [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=引用 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=引用 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]我知道啊,关键是为什么啊,博客里说明的应该是背景色啊。这样也不行。。 [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=引用 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=引用 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]
注意黑色部分不是重叠的,黄色部分才是。这样也不行。。 先绘制一个背景颜色,再绘制那个一个角是圆角的矩形,最后再使用背景颜色绘制一个三角形盖住矩形的一角。
@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=引用 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=引用 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=引用 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));,为什么没能实现,不是像你说的简单地覆盖。。。