现在很多项目很多地方都运用上了圆形ImageView显示头像或者图片,android原生的ImageView已经满足不了我很的需求,so我们就自定义个吧!
效果图:
1.首先肯定先继承ImageView,再来几个构造方法,并初始化画笔一支
public class CircleImageView extends ImageView {
/*画笔*/
private Paint paint;
public CircleImageView(Context context) {
super(context);
init();
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
}
}
2.重写onDraw()方法
@Override
protected void onDraw(Canvas canvas) {
//获取一张图片
Drawable drawable = getDrawable();
/*如果获取src为空*/
if (drawable == null) {
return;
}
if (getWidth() == 0 && getHeight() == 0) {
return;
}
if (!(drawable instanceof BitmapDrawable)) {
return;
}
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
if (bitmap == null) {
return;
}
}
3.最重要的部分,放心都有备注
private Bitmap circleDraw(Bitmap bitmap) {
int radius;
int width = this.getWidth();
int height = this.getHeight();
if (width > height) {
radius = width;
} else {
radius = height;
}
Bitmap output = Bitmap.createBitmap(radius, radius,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Rect rect = new Rect(0, 0, width, height);
/*抗锯齿*/
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
/*防抖动*/
paint.setDither(true);
/*canvas上绘制圆以外的区域为透明度的黑色,圆内区域为透明:*/
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(radius / 2,
radius / 2, radius / 2, paint);
/*详情请参考http://www.cnblogs.com/rayray/p/3670120.html*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/*修改图片大小*/
bitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, true);
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
总体就这样
package com.kekegdsz.www.circleimageview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
* Created by Administrator on 2016/10/27.
*/
public class CircleImageView extends ImageView {
/*画笔*/
private Paint paint;
public CircleImageView(Context context) {
super(context);
init();
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
//获取一张图片
Drawable drawable = getDrawable();
/*如果获取src为空*/
if (drawable == null) {
return;
}
if (getWidth() == 0 && getHeight() == 0) {
return;
}
if (!(drawable instanceof BitmapDrawable)) {
return;
}
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
if (bitmap == null) {
return;
}
/*主要函数*/
Bitmap circleDraw = this.circleDraw(bitmap);
/*清空画笔*/
this.paint.reset();
canvas.drawBitmap(circleDraw, 0, 0, null);
}
private Bitmap circleDraw(Bitmap bitmap) {
int radius;
int width = this.getWidth();
int height = this.getHeight();
if (width > height) {
radius = width;
} else {
radius = height;
}
Bitmap output = Bitmap.createBitmap(radius, radius,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Rect rect = new Rect(0, 0, width, height);
/*抗锯齿*/
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
/*防抖动*/
paint.setDither(true);
/*canvas上绘制圆以外的区域为透明度的黑色,圆内区域为透明:*/
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(radius / 2,
radius / 2, radius / 2, paint);
/*详情请参考http://www.cnblogs.com/rayray/p/3670120.html*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/*修改图片大小*/
bitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, true);
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
使用:
<com.kekegdsz.www.circleimageview.CircleImageView
android:layout_width="100dp"
android:src="@drawable/kekegdsz"
android:layout_height="100dp" />