本文实例为大家分享了android studio实现带边框的圆形头像的具体代码,供大家参考,具体内容如下
效果显示:
(没有边框的)
(有边框的)
1、创建自定义imagview控件
(1)、没有边框的
package chenglong.activitytest.pengintohospital.utils;
import android.content.context;
import android.graphics.bitmap;
import android.graphics.bitmapshader;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.matrix;
import android.graphics.paint;
import android.graphics.rect;
import android.graphics.shader;
import android.graphics.drawable.bitmapdrawable;
import android.graphics.drawable.colordrawable;
import android.graphics.drawable.drawable;
import android.util.attributeset;
import android.widget.imageview;
/**
*
* 圆形图片
* created by lichenglong on 2017-10-09.
*/
public class mine_imageviewplus extends imageview{
private paint mpaintbitmap = new paint(paint.anti_alias_flag);
private paint mpaintborder = new paint(paint.anti_alias_flag);
private bitmap mrawbitmap;
private bitmapshader mshader;
private matrix mmatrix = new matrix();
private float mborderwidth = dip2px(15);
private int mbordercolor = 0x80bebebe;
public mine_imageviewplus(context context, attributeset attrs) {
super(context, attrs);
}
@override
protected void ondraw(canvas canvas) {
bitmap rawbitmap = getbitmap(getdrawable());
if (rawbitmap != null){
int viewwidth = getwidth();
int viewheight = getheight();
int viewminsize = math.min(viewwidth, viewheight);
float dstwidth = viewminsize;
float dstheight = viewminsize;
if (mshader == null || !rawbitmap.equals(mrawbitmap)){
mrawbitmap = rawbitmap;
mshader = new bitmapshader(mrawbitmap, shader.tilemode.clamp, shader.tilemode.clamp);
}
if (mshader != null){
mmatrix.setscale((dstwidth - mborderwidth * 2) / rawbitmap.getwidth(), (dstheight - mborderwidth * 2) / rawbitmap.getheight());
mshader.setlocalmatrix(mmatrix);
}
mpaintbitmap.setshader(mshader);
mpaintborder.setstyle(paint.style.stroke);
mpaintborder.setstrokewidth(mborderwidth);
mpaintborder.setcolor(mbordercolor);
float radius = viewminsize / 2.0f;
canvas.drawcircle(radius, radius, radius - mborderwidth / 2.0f, mpaintborder);
canvas.translate(mborderwidth, mborderwidth);
canvas.drawcircle(radius - mborderwidth, radius - mborderwidth, radius - mborderwidth, mpaintbitmap);
} else {
super.ondraw(canvas);
}
}
private bitmap getbitmap(drawable drawable){
if (drawable instanceof bitmapdrawable){
return ((bitmapdrawable)drawable).getbitmap();
} else if (drawable instanceof colordrawable){
rect rect = drawable.getbounds();
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
int color = ((colordrawable)drawable).getcolor();
bitmap bitmap = bitmap.createbitmap(width, height, bitmap.config.argb_8888);
canvas canvas = new canvas(bitmap);
canvas.drawargb(color.alpha(color), color.red(color), color.green(color), color.blue(color));
return bitmap;
} else {
return null;
}
}
private int dip2px(int dipval) {
float scale = getresources().getdisplaymetrics().density;
return (int)(dipval * scale + 0.5f);
}
}
(2)、有边框的
package chenglong.activitytest.pengintohospital.utils;
import android.content.context;
import android.graphics.bitmap;
import android.graphics.bitmapshader;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.matrix;
import android.graphics.paint;
import android.graphics.rect;
import android.graphics.shader;
import android.graphics.drawable.bitmapdrawable;
import android.graphics.drawable.colordrawable;
import android.graphics.drawable.drawable;
import android.util.attributeset;
import android.widget.imageview;
/**
*
* 带边框的圆形图片
* created by lichenglong on 2017-10-09.
*/
public class imageviewplus extends imageview{
private paint mpaintbitmap = new paint(paint.anti_alias_flag);
private paint mpaintborder = new paint(paint.anti_alias_flag);//
private bitmap mrawbitmap;
private bitmapshader mshader;
private matrix mmatrix = new matrix();
private float mborderwidth = dip2px(15);
private int mbordercolor = 0xff0080ff;//外边框的颜色
public imageviewplus(context context, attributeset attrs) {
super(context, attrs);
}
@override
protected void ondraw(canvas canvas) {
bitmap rawbitmap = getbitmap(getdrawable());
if (rawbitmap != null){
int viewwidth = getwidth();
int viewheight = getheight();
int viewminsize = math.min(viewwidth, viewheight);
float dstwidth = viewminsize;
float dstheight = viewminsize;
if (mshader == null || !rawbitmap.equals(mrawbitmap)){
mrawbitmap = rawbitmap;
mshader = new bitmapshader(mrawbitmap, shader.tilemode.clamp, shader.tilemode.clamp);
}
if (mshader != null){
mmatrix.setscale((dstwidth - mborderwidth * 2) / rawbitmap.getwidth(), (dstheight - mborderwidth * 2) / rawbitmap.getheight());
mshader.setlocalmatrix(mmatrix);
}
mpaintbitmap.setshader(mshader);
mpaintborder.setstyle(paint.style.stroke);
mpaintborder.setstrokewidth(mborderwidth / 5.0f);//外边框的大小
mpaintborder.setcolor(mbordercolor);//添加外边框
float radius = viewminsize / 2.0f;
canvas.drawcircle(radius, radius, radius - mborderwidth / 6.0f, mpaintborder);
canvas.translate(mborderwidth, mborderwidth);
canvas.drawcircle(radius - mborderwidth, radius - mborderwidth, radius, mpaintbitmap);
} else {
super.ondraw(canvas);
}
}
private bitmap getbitmap(drawable drawable){
if (drawable instanceof bitmapdrawable){
return ((bitmapdrawable)drawable).getbitmap();
} else if (drawable instanceof colordrawable){
rect rect = drawable.getbounds();
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
int color = ((colordrawable)drawable).getcolor();
bitmap bitmap = bitmap.createbitmap(width, height, bitmap.config.argb_8888);
canvas canvas = new canvas(bitmap);
canvas.drawargb(color.alpha(color), color.red(color), color.green(color), color.blue(color));
return bitmap;
} else {
return null;
}
}
private int dip2px(int dipval) {
float scale = getresources().getdisplaymetrics().density;
return (int)(dipval * scale + 0.5f);
}
}
2、创建页面xml代码
android:id="@+id/mine_iv_headportrait"
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@mipmap/hospital" />
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。