Android開發幾行實現圓形頭像,以及一些常見需求形狀自定義ImageView組件

hksq000 8年前發布 | 37K 次閱讀 安卓開發 Android開發 移動開發

來自: http://www.cnblogs.com/mapleyuan/p/5203329.html

在實際開發中,我們經常會遇到這樣的需求,就是無論圖片長啥樣,我們都要其顯示成圓形、圓形加一個邊框、矩形加邊框,帶圓角的矩形等等,我已把自己平常用的組件和demo上傳到了github(https://github.com/mapleyuan/RoundImageView)上,效果如下。大家有興趣的可以下下來使用,發現有什么問題也歡迎向我提出。

下面我大概講下實現。

首先當然是繼承ImageView,重寫onDraw()方法。我們來看看onDraw的實現:

protected void onDraw(Canvas canvas) {

canvas.save();

drawPath();

canvas.clipPath(mPath);

super.onDraw(canvas);

canvas.restore();

drawCanvas(canvas);

}

先調用了一個繪制區域的方法,那再來看下這個方法的實現:

private void drawPath() {

……………………..……………………..

省略不關鍵部分

……………………...…………………….

case CIRCLE:

float r = Math.min(width, height) / 2;

mPath.reset();

mPath.addCircle(width / 2, height / 2, r, Path.Direction.CW);

mPath.close();

break;

……………………...…………………….

省略不關鍵部分

……………………...…………………….

}

可以看到,調用了addCircle方法,順時針繪制了一個圓。回到onDraw方法,調用了Canvas的clipPath方法對view進行了裁剪,然后再繪制就相當于在上面蓋了一層蒙板。OK,到這里,我們就已經實現了一個圓形頭像。假如,你還不滿足于此,比如想加上一個邊框,那么

繼續往下看,發現又調用了drawCanvas方法

private void drawCanvas(Canvas canvas) {

int width = getWidth();

int height = getHeight();

if (mBorderWidth <= 0) {

return;

}

mBorderPaint.setColor(mBorderColor);

mBorderPaint.setStrokeWidth(mBorderWidth);

mBorderPaint.setStyle(Paint.Style.STROKE);

mBorderPaint.setAntiAlias(true);

……………………...…………………….

省略不關鍵部分

……………………...…………………….

case CIRCLE:

float r = Math.min(width, height) / 2;

canvas.drawCircle(width / 2, height / 2, r - mBorderWidth / 2, mBorderPaint);

break;

……………………...…………………….

省略不關鍵部分

……………………...…………………….

}

通過對畫筆設置寬度,顏色,最后在canvas進行繪制圓圈。至此,我們基本上就實現了圓形imgeview功能,對于其他形狀,原理類似。更多代碼詳情歡迎到github(https://github.com/mapleyuan/RoundImageView)上下載,也歡迎關注指出問題。后續也會陸續把平常常用組件放上去,歡迎關注下載,謝謝~

</div>

 本文由用戶 hksq000 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!