Android 一個(gè)萬能的圓角ImageView

前言:

開發(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容