Android中实现圆角矩形和圆形有很多种方式,其中最常见的方法有ImageLoader设置Option和自定义View。
1.ImageLoader加载图片
public static DisplayImageOptions getRoundOptions() { DisplayImageOptions options = new DisplayImageOptions.Builder() // 是否设置为圆角,弧度为多少,当弧度为90时显示的是一个圆 .displayer(new RoundedBitmapDisplayer(30)) .build(); return options; }ImageLoader.getInstance().displayImage(imageURL, imageView, Options.getRoundOptions());
2.自定义View实现
自定义View实现圆角矩形和圆形也有很多方法,其中最常见的就是利用Xfermode,Shader。本文就是使用BitmapShader实现圆角的绘制。
自定义CircleImageView
浅谈BitmapShader
BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置,这里我们只关注BitmapShader,构造方法:
mBitmapShader = new BitmapShader(bitmap,TileMode.CLAMP, TileMode.CLAMP);
参数1:bitmap
参数2,参数3:TileMode;
TileMode的取值有三种:
CLAMP 拉伸
REPEAT 重复
MIRROR 镜像
重复:就是横向、纵向不断重复这个bitmap
镜像:横向不断翻转重复,纵向不断翻转重复;
拉伸:重复图片最后的那一个像素;横向的最后一个横行像素,不断的重复,纵项的那一列像素,不断的重复;
现在大概明白了,BitmapShader通过设置给mPaint,然后用这个mPaint绘图时,就会根据你设置的TileMode,对绘制区域进行着色。
对于我们的圆角,以及圆形,我们设置的模式都是CLAMP,但是你会不会会有一个疑问:
view的宽或者高大于我们的bitmap宽或者高岂不是会拉伸?
嗯,我们会为BitmapShader设置一个matrix,去适当的放大或者缩小图片,不会让“ view的宽或者高大于我们的bitmap宽或者高 ”此条件成立的。
自定义属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable> <attr format="enum"> <enum value="0"/> <enum value="1"/> </attr> <attr format="dimension" /> <attr format="dimension" /> <attr format="color" /> </declare-styleable> </resources>获取自定义属性
public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0); // 获取类型 type = a.getInt(R.styleable.CircleImageView_type, TYPE_CIRCLE); // 获取圆角半径 mRoundRadius = a.getDimensionPixelSize(R.styleable.CircleImageView_round_Radius, DEFAULT_ROUND_RADIUS); // 获取边界的宽度 mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH); // 获取边缘的颜色 mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,DEFAULT_BORDER_COLOR); //调用 recycle() 回收TypedArray,以便后面重用 a.recycle(); init(); }
onMeasure
设置初始化参数