自定义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 实现圆形头像
发布评论