android洪洋csdn,Android Drawable设计圆角

前言

今天要说的,不是使用shape来创建圆角,也不是使用第三方框架来变化。是继承Drawable设计圆角。

在这里感谢洪洋大神的知识分享!

具体代码

设计圆角

public class RoundImageDrawable extends Drawable {

private Bitmap bitmap;

private Paint paint;

private RectF rectF;

public RoundImageDrawable(Bitmap bitmap) {

this.bitmap = bitmap;

BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

paint = new Paint();

paint.setAntiAlias(true);

paint.setShader(shader);

}

@Override

public void setBounds(int left, int top, int right, int bottom) {

super.setBounds(left, top, right, bottom);

rectF = new RectF(left, top, right, bottom);

}

@Override

public void draw(@NonNull Canvas canvas) {

canvas.drawRoundRect(rectF, 10, 10, paint);

}

@Override

public void setAlpha(@IntRange(from = 0, to = 255) int i) {

paint.setAlpha(i);

}

@Override

public void setColorFilter(@Nullable ColorFilter colorFilter) {

paint.setColorFilter(colorFilter);

}

@Override

public int getIntrinsicHeight() {

return bitmap.getHeight();

}

@Override

public int getIntrinsicWidth() {

return bitmap.getWidth();

}

@Override

public int getOpacity() {

return PixelFormat.TRANSLUCENT;

}

}

设计圆形

public class CircelImageDrawable extends Drawable {

private Bitmap bitmap;

private Paint paint;

private RectF rectF;

private int width;

public CircelImageDrawable(Bitmap bitmap) {

this.bitmap = bitmap;

BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

paint = new Paint();

paint.setAntiAlias(true);

paint.setShader(shader);

width = Math.min(bitmap.getWidth(), bitmap.getHeight());

}

@Override

public void setBounds(int left, int top, int right, int bottom) {

super.setBounds(left, top, right, bottom);

rectF = new RectF(left, top, right, bottom);

}

@Override

public void draw(@NonNull Canvas canvas) {

canvas.drawCircle(width / 2, width / 2, width / 2, paint);

}

@Override

public void setAlpha(@IntRange(from = 0, to = 255) int i) {

paint.setAlpha(i);

}

@Override

public void setColorFilter(@Nullable ColorFilter colorFilter) {

paint.setColorFilter(colorFilter);

}

@Override

public int getIntrinsicHeight() {

return bitmap.getHeight();

}

@Override

public int getIntrinsicWidth() {

return bitmap.getWidth();

}

@Override

public int getOpacity() {

return PixelFormat.TRANSLUCENT;

}

}

其实两者差别不大,细心的盆友应该能看出来

圆形是圆角的一个特例,将半径和左上右下的弧度设置的和图片宽度一半长一样而已。

注:

关于BitmapShader:

官方解释:

使用特定的图片来作为文理来处理。

Shader used to draw a bitmap as a texture.

BitmapShader 的构造函数

public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY)

三个参数:bitmap 指的是要作为纹理的图片,tileX 指的是在x方向纹理的绘制模式,tileY 指的是Y方向上的绘制模式。

TileMode 是一个枚举类型,有3个可能的值:

1、CLMP 如果需要填充的内容大小超过了bitmap size 就选bitmap 边界的颜色进行扩展

2、REPEAT重复,不断的重复bitmap去填满,如果绘制的区域大于纹理图片的话,纹理图片会在这片区域不断重复

3、MIRROR镜像的去填满。如果绘制的区域大于纹理图片的话,纹理图片会以镜像的形式重复出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值