Android開發幾行實現圓形頭像,以及一些常見需求形狀自定義ImageView組件
來自: 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>