自定义带 vip 标识的 圆形头像(圆形ImageView)
【摘要】
import java.lang.ref.WeakReference;
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.C...
-
-
import java.lang.ref.WeakReference;
-
-
import android.content.Context;
-
import android.content.res.TypedArray;
-
import android.graphics.Bitmap;
-
import android.graphics.Canvas;
-
import android.graphics.Color;
-
import android.graphics.Paint;
-
import android.graphics.PorterDuff;
-
import android.graphics.PorterDuffXfermode;
-
import android.graphics.RectF;
-
import android.graphics.Xfermode;
-
import android.graphics.drawable.Drawable;
-
import android.util.AttributeSet;
-
import android.util.TypedValue;
-
import android.widget.ImageView;
-
-
import com.ccvideo.R;
-
-
public class RoundImageView extends ImageView {
-
private Paint mPaint;
-
private Xfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
-
-
private WeakReference<Bitmap> mWeakBitmap;
-
private WeakReference<Bitmap> mMaskWeakBitmap;
-
private WeakReference<Canvas> mWeakCanvas;
-
-
public static final int TYPE_CIRCLE = 0;
-
public static final int TYPE_ROUND = 1;
-
-
private static final int BORDER_RADIUS_DEFAULT = 10;
-
private static final int BORDER_WIDTH_DEFAULT = 0;
-
private static final int BORDER_COLOR_DEFAULT = R.color.black_alpha_percent_10;
-
-
private int mShapeType;
-
private int mBorderRadius;
-
private int mBorderWidth;
-
private int mBorderColor;
-
private int mOverLayColor;
-
-
public RoundImageView(Context context, int BorderWidth, int BorderColor) {
-
this(context, null);
-
this.mBorderWidth = BorderWidth;
-
this.mBorderColor = BorderColor;
-
mPaint = new Paint();
-
mPaint.setAntiAlias(true);
-
}
-
-
public RoundImageView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
mPaint = new Paint();
-
mPaint.setAntiAlias(true);
-
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundImageView);
-
-
mBorderRadius = a.getDimensionPixelSize(R.styleable.RoundImageView_border_radius,
-
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
-
BORDER_RADIUS_DEFAULT, getResources().getDisplayMetrics()));// Default 10dp
-
mShapeType = a.getInt(R.styleable.RoundImageView_type, TYPE_CIRCLE);
-
mBorderWidth = a.getDimensionPixelSize(R.styleable.RoundImageView_border_width,
-
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
-
BORDER_WIDTH_DEFAULT, getResources().getDisplayMetrics()));
-
mBorderColor = a.getColor(R.styleable.RoundImageView_border_color, BORDER_COLOR_DEFAULT);
-
mOverLayColor = a.getColor(R.styleable.RoundImageView_overlay, android.R.color.transparent);
-
-
a.recycle();
-
}
-
-
@Override
-
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-
if (mShapeType == TYPE_CIRCLE) {
-
int width = Math.min(getMeasuredWidth(), getMeasuredHeight());
-
// setMeasuredDimension(width, width);
-
}
-
-
}
-
-
@Override
-
public void invalidate() {
-
mWeakBitmap = null;
-
mMaskWeakBitmap = null;
-
mWeakCanvas = null;
-
super.invalidate();
-
}
-
-
@Override
-
protected void onDraw(Canvas canvas) {
-
Drawable drawable = getDrawable();
-
if (drawable == null || getWidth() == 0 || getHeight() == 0) {
-
return;
-
}
-
-
Bitmap bitmap = mWeakBitmap == null ? null : mWeakBitmap.get();
-
if (bitmap == null || bitmap.isRecycled()) {
-
bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
-
}
-
-
Canvas drawCanvas = mWeakCanvas == null ? null : mWeakCanvas.get();
-
if (drawCanvas == null) {
-
drawCanvas = new Canvas(bitmap);
-
}
-
-
float scale = 1.0f;
-
int drawableWidth = drawable.getIntrinsicWidth();
-
int drawableHeight = drawable.getIntrinsicHeight();
-
if (mShapeType == TYPE_ROUND) {
-
scale = Math.max(getWidth() * 1.0f / drawableWidth, getHeight() * 1.0f / drawableHeight);
-
} else {
-
scale = getWidth() * 1.0f / Math.min(drawableWidth, drawableHeight);
-
}
-
drawable.setBounds(0, 0, (int) (scale * drawableWidth), (int) (scale * drawableHeight));
-
drawable.draw(drawCanvas);
-
-
mPaint.reset();
-
mPaint.setColor(mOverLayColor);
-
drawCanvas.drawColor(mOverLayColor);
-
-
mPaint.reset();
-
mPaint.setFilterBitmap(false);
-
mPaint.setXfermode(mXfermode);
-
-
Bitmap maskBitmap = mMaskWeakBitmap == null ? null : mMaskWeakBitmap.get();
-
if (maskBitmap == null || maskBitmap.isRecycled()) {
-
maskBitmap = getBitmap();
-
mMaskWeakBitmap = new WeakReference<Bitmap>(maskBitmap);
-
}
-
drawCanvas.drawBitmap(maskBitmap, 0, 0, mPaint);
-
mPaint.setXfermode(null);
-
if (mBorderWidth > 0) {
-
drawCircleBorder(drawCanvas);
-
}
-
-
canvas.drawBitmap(bitmap, 0, 0, null);
-
}
-
-
private Bitmap getBitmap() {
-
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
-
Canvas canvas = new Canvas(bitmap);
-
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
paint.setColor(Color.BLACK);
-
-
if (mShapeType == TYPE_ROUND) {
-
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()),
-
mBorderRadius, mBorderRadius, paint);
-
} else {
-
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - mBorderWidth, paint);
-
}
-
-
return bitmap;
-
}
-
-
private void drawCircleBorder(Canvas canvas) {
-
Paint paint = new Paint();
-
paint.setAntiAlias(true);
-
paint.setFilterBitmap(true);
-
paint.setDither(true);
-
paint.setColor(mBorderColor);
-
paint.setStyle(Paint.Style.STROKE);
-
paint.setStrokeWidth(mBorderWidth);
-
if (mShapeType == TYPE_ROUND) {
-
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()),
-
mBorderRadius, mBorderRadius, paint);
-
} else {
-
canvas.drawCircle(getWidth() / 2, getWidth() / 2, (getWidth() - mBorderWidth) / 2, paint);
-
}
-
}
-
-
public void setBorderWidth(int borderWidth) {
-
this.mBorderWidth = mBorderWidth;
-
}
-
-
public void setBorderColor(int borderColor) {
-
this.mBorderColor = mBorderColor;
-
}
-
}
-
-
-
package com.yizhibo.video.view;
-
import java.lang.ref.WeakReference;
-
import android.content.Context;
-
import android.content.res.TypedArray;
-
import android.graphics.Bitmap;
-
import android.graphics.BitmapFactory;
-
import android.graphics.Canvas;
-
import android.graphics.Color;
-
import android.graphics.Matrix;
-
import android.graphics.Paint;
-
import android.graphics.PorterDuff;
-
import android.graphics.PorterDuffXfermode;
-
import android.graphics.Xfermode;
-
import android.graphics.drawable.Drawable;
-
import android.util.AttributeSet;
-
import android.util.TypedValue;
-
import android.widget.ImageView;
-
-
import com.ccvideo.R;
-
-
public class MyUserPhoto extends ImageView {
-
private static final int BORDER_SMALL_WIDTH_DEFAULT = 10;
-
private static final int BORDER_SMALL_HEIGHT_DEFAULT = 10;
-
private static final int IS_VIP = 1;
-
-
private static final int BORDER_WIDTH_DEFAULT = 0;
-
private static final int BORDER_COLOR_DEFAULT = R.color.black_alpha_percent_10;
-
-
private int mSmallImageWidth;
-
private int mSmallImageHeight;
-
private int mIsVip;
-
private int mBorderWidth;
-
private int mBorderColor;
-
private int mSmallIconResId;
-
-
private Paint mPaint;
-
private Xfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
-
-
private WeakReference<Bitmap> mWeakBitmap;
-
private WeakReference<Bitmap> mMaskWeakBitmap;
-
private WeakReference<Canvas> mWeakCanvas;
-
-
public MyUserPhoto(Context context) {
-
super(context);
-
}
-
-
public MyUserPhoto(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
mPaint = new Paint();
-
mPaint.setAntiAlias(true);
-
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyUserPhoto);
-
mSmallImageHeight = a.getDimensionPixelSize(R.styleable.MyUserPhoto_small_height,
-
BORDER_SMALL_HEIGHT_DEFAULT);
-
mSmallImageWidth = a.getDimensionPixelSize(R.styleable.MyUserPhoto_small_width,
-
BORDER_SMALL_WIDTH_DEFAULT);
-
mIsVip = a.getInt(R.styleable.MyUserPhoto_is_vip, 0);
-
mSmallIconResId = a.getResourceId(R.styleable.MyUserPhoto_small_icon,
-
R.drawable.floating_screen_v);
-
-
mBorderWidth = a.getDimensionPixelSize(R.styleable.MyUserPhoto_border_width,
-
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
-
BORDER_WIDTH_DEFAULT, getResources().getDisplayMetrics()));
-
mBorderColor = a.getColor(R.styleable.MyUserPhoto_border_color, BORDER_COLOR_DEFAULT);
-
-
setWillNotDraw(false);
-
-
a.recycle();
-
}
-
-
@Override
-
public void invalidate() {
-
mWeakBitmap = null;
-
mMaskWeakBitmap = null;
-
mWeakCanvas = null;
-
super.invalidate();
-
}
-
-
@Override
-
protected void onDraw(Canvas canvas) {
-
Drawable drawable = getDrawable();
-
if (drawable == null || getWidth() == 0 || getHeight() == 0) {
-
return;
-
}
-
-
Bitmap bitmap = mWeakBitmap == null ? null : mWeakBitmap.get();
-
if (bitmap == null || bitmap.isRecycled()) {
-
bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
-
mWeakBitmap = new WeakReference<Bitmap>(bitmap);
-
}
-
-
Canvas drawCanvas = mWeakCanvas == null ? null : mWeakCanvas.get();
-
if (drawCanvas == null) {
-
drawCanvas = new Canvas(bitmap);
-
mWeakCanvas = new WeakReference<Canvas>(drawCanvas);
-
}
-
-
float scale = 1.0f;
-
int drawableWidth = drawable.getIntrinsicWidth();
-
int drawableHeight = drawable.getIntrinsicHeight();
-
-
scale = getWidth() * 1.0f / Math.min(drawableWidth, drawableHeight);
-
drawable.setBounds(0, 0, (int) (scale * drawableWidth), (int) (scale * drawableHeight));
-
drawable.draw(drawCanvas);
-
-
mPaint.reset();
-
mPaint.setFilterBitmap(false);
-
mPaint.setXfermode(mXfermode);
-
-
Bitmap maskBitmap = mMaskWeakBitmap == null ? null : mMaskWeakBitmap.get();
-
if (maskBitmap == null || maskBitmap.isRecycled()) {
-
maskBitmap = getMaskBitmap();
-
mMaskWeakBitmap = new WeakReference<Bitmap>(maskBitmap);
-
}
-
drawCanvas.drawBitmap(maskBitmap, 0, 0, mPaint);
-
mPaint.setXfermode(null);
-
if (mBorderWidth > 0) {
-
drawCircleBorder(drawCanvas);
-
}
-
if (mIsVip == IS_VIP && (mSmallImageWidth > 0 || mSmallImageHeight > 0)) {
-
drawSmallIcon(drawCanvas);
-
}
-
-
canvas.drawBitmap(bitmap, 0, 0, null);
-
}
-
-
-
private Bitmap getMaskBitmap() {
-
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
-
Canvas canvas = new Canvas(bitmap);
-
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
paint.setColor(Color.BLACK);
-
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - mBorderWidth, paint);
-
-
return bitmap;
-
}
-
-
private void drawCircleBorder(Canvas canvas) {
-
Paint paint = new Paint();
-
paint.setAntiAlias(true);
-
paint.setFilterBitmap(true);
-
paint.setDither(true);
-
paint.setColor(mBorderColor);
-
paint.setStyle(Paint.Style.STROKE);
-
paint.setStrokeWidth(mBorderWidth);
-
canvas.drawCircle(getWidth() / 2, getWidth() / 2, (getWidth() - mBorderWidth) / 2, paint);
-
}
-
-
private void drawSmallIcon(Canvas canvas) {
-
int smallIconSize = mSmallImageWidth;
-
Bitmap smallIconBitmap = BitmapFactory.decodeResource(getResources(), mSmallIconResId);
-
smallIconBitmap = scaleImage(smallIconBitmap, smallIconSize, smallIconSize);
-
float marginTop = getWidth() / 2.0f + (float)Math.sqrt(2) * (getHeight() / 2.0f) / 2.0f
-
- smallIconSize / 2.0f;
-
float marginLeft = marginTop;
-
canvas.drawBitmap(smallIconBitmap, marginLeft, marginTop, null);
-
smallIconBitmap.recycle();
-
}
-
-
private Bitmap scaleImage(Bitmap bitmap, float newWidth, float newHeight) {
-
float width = bitmap.getWidth();
-
float height = bitmap.getHeight();
-
Matrix matrix = new Matrix();
-
float scaleWidth = newWidth / width;
-
float scaleHeight = newHeight / height;
-
matrix.postScale(scaleWidth, scaleHeight);
-
return Bitmap.createBitmap(bitmap, 0, 0, (int) width, (int) height, matrix, true);
-
}
-
-
public ImageView getRoundImageView() {
-
return this;
-
}
-
-
public void setIsVip(int isVip) {
-
if (mIsVip != isVip) {
-
mIsVip = isVip;
-
invalidate();
-
}
-
}
-
}
文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。
原文链接:wukong.blog.csdn.net/article/details/49890705
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)