首页 > 系统 > Android > 正文

Android Studio实现带边框的圆形头像

2019-10-22 18:25:51
字体:
来源:转载
供稿:网友

本文实例为大家分享了Android Studio实现带边框的圆形头像的具体代码,供大家参考,具体内容如下

效果显示:

(没有边框的)

Android,Studio,圆形头像

(有边框的)

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代码

<chenglong.activitytest.pengintohospital.utils.ImageViewPlus android:id="@+id/mine_iv_headportrait" android:layout_width="150dp" android:layout_height="150dp" android:src="@mipmap/hospital" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表