前言:
開發(fā)Android的都會(huì)遇到圓角圖片的處理?
網(wǎng)上也有很多圓角的開源ImageView
用的最多的就是Roundedimageview 可以滿足很多圓角需求?
但是我要說的是?roundedimageview也有弊端 比如說 列表使用的時(shí)候 圓角有時(shí)候渲染不出來?
加載動(dòng)圖 不能圓角 折疊動(dòng)畫 圓角失效
大致了解一下 開源的圓角ImagView 都是對(duì)圖片做處理 這樣非常浪費(fèi)性能
因?yàn)楣鹃_發(fā)需求 要?jiǎng)訄D圓角 顯然roundedimageview不是遠(yuǎn)遠(yuǎn)不夠的
?在網(wǎng)上搜羅一番 也沒找到想要的答案
后來就想 操作bitmap太麻煩 為何不如直接操控控件呢?
于是就有一個(gè)百十行代碼的圓角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;
? ? }
}
思路很簡(jiǎn)單 就是畫View的四個(gè)角為圓 顏色和背景一致 這樣加載的View就是圓角的了
也可以擴(kuò)展?cornerSize? 目前我設(shè)定的四個(gè)角一樣 可以根據(jù)自己的需求 四個(gè)角設(shè)置不一樣的值
這么寫的優(yōu)勢(shì)是 不直接操作Bitmap 加載圖片和原生ImagView一樣 支持動(dòng)圖 也可以繼承容器View 這樣容器View 也可以是圓角
就這些8 有什么說的不對(duì) 希望多多指點(diǎn)