Android 简易 自定义ImageView 实现圆形头像

编程入门 行业动态 更新时间:2024-10-21 16:05:26

Android 简易 <a href=https://www.elefans.com/category/jswz/34/1771438.html style=自定义ImageView 实现圆形头像"/>

Android 简易 自定义ImageView 实现圆形头像

实现思路:

首先把xml文件传过来的bitmap放缩为组件对应的大小,再裁剪成正方形,然后通过Paint.setShader(new BitmapShader())方法,将bitmap设置为填充色,最后画一个圆搞定。

效果:

源码 :


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
/*** Created by 煎鱼 on 2017/11/11.*/public class RoundView extends android.support.v7.widget.AppCompatImageView {private static final String TAG = "RoundView";private int D_Width;//圆的直径,D_Width = Math.min(width,heigh);private int src; //通过自定义属性传进来的bitmap的资源码private  Bitmap b;public RoundView(Context context) {super(context);}public RoundView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public RoundView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context,attrs);}private void init(Context context, AttributeSet attrs) {//获取自定义属性。TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundView);src = ta.getResourceId( R.styleable.RoundView_src,-1);if( src== -1 ){b = BitmapFactory.decodeResource(getResources(), R.drawable.t1);//默认图}else{b = BitmapFactory.decodeResource(getResources(), src);}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int width = MeasureSpec.getSize(widthMeasureSpec);int heighMode = MeasureSpec.getMode(heightMeasureSpec);int heigh = MeasureSpec.getSize(heightMeasureSpec);D_Width = Math.min(width,heigh);alterBitmap();setMeasuredDimension(width, heigh);}private void alterBitmap() {//先缩小再裁剪:b = scaleBitmap( b , (float) D_Width/Math.min(b.getWidth(),b.getHeight()) );//计算比例b = cropBitmap(b);}@Overrideprotected void onDraw(Canvas canvas) {Paint mPaint = new Paint();mPaint.setAntiAlias(true);//以bitmap为填充内容画一个圆mPaint.setShader(new BitmapShader(b, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR));canvas.drawCircle(D_Width / 2, D_Width / 2, D_Width / 2, mPaint);//画外边框mPaint.reset();mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(10);mPaint.setColor(0xffdddddd);canvas.drawCircle(D_Width / 2, D_Width / 2, D_Width / 2, mPaint);}/*** 按比例缩放图片** @param origin 原图* @param ratio  比例* @return 新的bitmap*/private Bitmap scaleBitmap(Bitmap origin, float ratio) {if (origin == null) {return null;}int width = origin.getWidth();int height = origin.getHeight();Matrix matrix = new Matrix();matrix.postScale(ratio, ratio);Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, true);if (newBM.equals(origin)) {return newBM;}origin.recycle();return newBM;}/*** 裁剪成正方形** @param bitmap 原图* @return 裁剪后的图像*/private Bitmap cropBitmap(Bitmap bitmap) {int w = bitmap.getWidth(); // 得到图片的宽,高int h = bitmap.getHeight();int cropWidth = w;int cropHeight = h;//在取图片较短边作为正方形的边长,从图片长边的中间进行裁剪if(w>=h){cropWidth = h;return Bitmap.createBitmap(bitmap, (w-h)/2, 0, cropWidth, cropHeight , null, false);}else{cropHeight = w;return Bitmap.createBitmap(bitmap, 0 , (h-w)/2  , cropWidth, cropHeight , null, false);}}}

更多推荐

Android 简易 自定义ImageView 实现圆形头像

本文发布于:2024-02-12 16:05:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1688481.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   圆形   简易   头像   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!