前言:
开发Android的都会遇到圆角图片的处理
网上也有很多圆角的开源ImageView
用的最多的就是Roundedimageview 可以满足很多圆角需求
但是我要说的是 roundedimageview也有弊端 比如说 列表使用的时候 圆角有时候渲染不出来
加载动图 不能圆角 折叠动画 圆角失效
大致了解一下 开源的圆角ImagView 都是对图片做处理 这样非常浪费性能
因为公司开发需求 要动图圆角 显然roundedimageview不是远远不够的
在网上搜罗一番 也没找到想要的答案
后来就想 操作bitmap太麻烦 为何不如直接操控控件呢?
于是就有一个百十行代码的圆角View 任何控件都能变成圆角
public class RoundedImagViewextends android.support.v7.widget.AppCompatImageView {
private int cornerSize =30;
private Paintpaint;
public RoundedImagView(Context context) {
super(context);
paint =new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);//消除锯齿
}
public RoundedImagView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint =new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);//消除锯齿
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
drawLeftTop(canvas);
drawRightTop(canvas);
drawLeftBottom(canvas);
drawRightBottom(canvas);
}
private void drawLeftTop(Canvas canvas) {
Path path =new Path();
path.moveTo(0, cornerSize);
path.lineTo(0, 0);
path.lineTo(cornerSize, 0);
path.arcTo(new RectF(0, 0, cornerSize *2, cornerSize *2), -90, -90);
path.close();
canvas.drawPath(path, paint);
}
private void drawLeftBottom(Canvas canvas) {
Path path =new Path();
path.moveTo(0, getHeight() -cornerSize);
path.lineTo(0, getHeight());
path.lineTo(cornerSize, getHeight());
path.arcTo(new RectF(0, // x
getHeight() -cornerSize *2,// y
cornerSize *2,// x
getHeight()// getWidth()// y
), 90, 90);
path.close();
canvas.drawPath(path, paint);
}
private void drawRightBottom(Canvas canvas) {
Path path =new Path();
path.moveTo(getWidth() -cornerSize, getHeight());
path.lineTo(getWidth(), getHeight());
path.lineTo(getWidth(), getHeight() -cornerSize);
RectF oval =new RectF(getWidth() -cornerSize *2, getHeight()
-cornerSize *2, getWidth(), getHeight());
path.arcTo(oval, 0, 90);
path.close();
canvas.drawPath(path, paint);
}
private void drawRightTop(Canvas canvas) {
Path path =new Path();
path.moveTo(getWidth(), cornerSize);
path.lineTo(getWidth(), 0);
path.lineTo(getWidth() -cornerSize, 0);
path.arcTo(new RectF(getWidth() -cornerSize *2, 0, getWidth(),
0 +cornerSize *2), -90, 90);
path.close();
canvas.drawPath(path, paint);
}
public int getCornerSize() {
return cornerSize;
}
public void setCornerSize(int cornerSize) {
this.cornerSize = cornerSize;
}
}
思路很简单 就是画View的四个角为圆 颜色和背景一致 这样加载的View就是圆角的了
也可以扩展 cornerSize 目前我设定的四个角一样 可以根据自己的需求 四个角设置不一样的值
这么写的优势是 不直接操作Bitmap 加载图片和原生ImagView一样 支持动图 也可以继承容器View 这样容器View 也可以是圆角
就这些8 有什么说的不对 希望多多指点
网友评论