博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CircleImageView 圆形图片头像实现
阅读量:5890 次
发布时间:2019-06-19

本文共 6521 字,大约阅读时间需要 21 分钟。

package com.view.drop;import android.content.Context;import android.content.res.TypedArray;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.RectF;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;/** * Copyright 2014 Henning Dodenhof *  * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at *  * http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. *  */public class CircleImageView extends ImageView {	private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;	private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;	private static final int COLORDRAWABLE_DIMENSION = 1;	private static final int DEFAULT_BORDER_WIDTH = 0;	private static final int DEFAULT_BORDER_COLOR = Color.BLACK;	private final RectF mDrawableRect = new RectF();	private final RectF mBorderRect = new RectF();	private final Matrix mShaderMatrix = new Matrix();	private final Paint mBitmapPaint = new Paint();	private final Paint mBorderPaint = new Paint();	private int mBorderColor = DEFAULT_BORDER_COLOR;	private int mBorderWidth = DEFAULT_BORDER_WIDTH;	private Bitmap mBitmap;	private BitmapShader mBitmapShader;	private int mBitmapWidth;	private int mBitmapHeight;	private float mDrawableRadius;	private float mBorderRadius;	private boolean mReady;	private boolean mSetupPending;	public CircleImageView(Context context) {		super(context);	}	public CircleImageView(Context context, AttributeSet attrs) {		this(context, attrs, 0);	}	public CircleImageView(Context context, AttributeSet attrs, int defStyle) {		super(context, attrs, defStyle);		super.setScaleType(SCALE_TYPE);		TypedArray a = context.obtainStyledAttributes(attrs,				R.styleable.CircleImageView, defStyle, 0);		mBorderWidth = a.getDimensionPixelSize(				R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);		mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,				DEFAULT_BORDER_COLOR);		a.recycle();		mReady = true;		if (mSetupPending) {			setup();			mSetupPending = false;		}	}	@Override	public ScaleType getScaleType() {		return SCALE_TYPE;	}	@Override	public void setScaleType(ScaleType scaleType) {		if (scaleType != SCALE_TYPE) {			throw new IllegalArgumentException(String.format(					"ScaleType %s not supported.", scaleType));		}	}	@Override	protected void onDraw(Canvas canvas) {		if (getDrawable() == null) {			return;		}		canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,				mBitmapPaint);		if (mBorderWidth != 0) {			canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,					mBorderPaint);		}	}	@Override	protected void onSizeChanged(int w, int h, int oldw, int oldh) {		super.onSizeChanged(w, h, oldw, oldh);		setup();	}	public int getBorderColor() {		return mBorderColor;	}	public void setBorderColor(int borderColor) {		if (borderColor == mBorderColor) {			return;		}		mBorderColor = borderColor;		mBorderPaint.setColor(mBorderColor);		invalidate();	}	public int getBorderWidth() {		return mBorderWidth;	}	public void setBorderWidth(int borderWidth) {		if (borderWidth == mBorderWidth) {			return;		}		mBorderWidth = borderWidth;		setup();	}	@Override	public void setImageBitmap(Bitmap bm) {		super.setImageBitmap(bm);		mBitmap = bm;		setup();	}	@Override	public void setImageDrawable(Drawable drawable) {		super.setImageDrawable(drawable);		mBitmap = getBitmapFromDrawable(drawable);		setup();	}	@Override	public void setImageResource(int resId) {		super.setImageResource(resId);		mBitmap = getBitmapFromDrawable(getDrawable());		setup();	}	private Bitmap getBitmapFromDrawable(Drawable drawable) {		if (drawable == null) {			return null;		}		if (drawable instanceof BitmapDrawable) {			return ((BitmapDrawable) drawable).getBitmap();		}		try {			Bitmap bitmap;			if (drawable instanceof ColorDrawable) {				bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,						COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);			} else {				bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),						drawable.getIntrinsicHeight(), BITMAP_CONFIG);			}			Canvas canvas = new Canvas(bitmap);			drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());			drawable.draw(canvas);			return bitmap;		} catch (OutOfMemoryError e) {			return null;		}	}	private void setup() {		if (!mReady) {			mSetupPending = true;			return;		}		if (mBitmap == null) {			return;		}		mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,				Shader.TileMode.CLAMP);		mBitmapPaint.setAntiAlias(true);		mBitmapPaint.setShader(mBitmapShader);		mBorderPaint.setStyle(Paint.Style.STROKE);		mBorderPaint.setAntiAlias(true);		mBorderPaint.setColor(mBorderColor);		mBorderPaint.setStrokeWidth(mBorderWidth);		mBitmapHeight = mBitmap.getHeight();		mBitmapWidth = mBitmap.getWidth();		mBorderRect.set(0, 0, getWidth(), getHeight());		mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2,				(mBorderRect.width() - mBorderWidth) / 2);		mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()				- mBorderWidth, mBorderRect.height() - mBorderWidth);		mDrawableRadius = Math.min(mDrawableRect.height() / 2,				mDrawableRect.width() / 2);		updateShaderMatrix();		invalidate();	}	private void updateShaderMatrix() {		float scale;		float dx = 0;		float dy = 0;		mShaderMatrix.set(null);		if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()				* mBitmapHeight) {			scale = mDrawableRect.height() / (float) mBitmapHeight;			dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;		} else {			scale = mDrawableRect.width() / (float) mBitmapWidth;			dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;		}		mShaderMatrix.setScale(scale, scale);		mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,				(int) (dy + 0.5f) + mBorderWidth);		mBitmapShader.setLocalMatrix(mShaderMatrix);	}}

  

转载地址:http://gnwsx.baihongyu.com/

你可能感兴趣的文章
PYTHON2.day05
查看>>
ocp题库更新,052最新考试题及答案整理-31
查看>>
Git-常用命令集合
查看>>
最近学习到的一些
查看>>
Windows环境下免安装版MySQL 5.6.11安装配置详解
查看>>
leetcode记录-反转整数
查看>>
matlab-画个拱桥和倒影?
查看>>
8.5 exit函数-进程控制
查看>>
安装SeleniumIDE(基于Ubuntu Desktop 12.04 LTS)
查看>>
效率和协作工具--OneNote
查看>>
在Ubuntu 14.04 64bit上安装numpy和matplotlib库
查看>>
JSK-61 二进制加法【大数】
查看>>
HDU1877 又一版 A+B
查看>>
@ 添加属性(属性注入)
查看>>
往sde中导入要素类报错000732
查看>>
sql基本运算
查看>>
cxf 整合 spring 时 java.lang.VerifyError异常
查看>>
javascript中工厂模式
查看>>
MFC GetDlgItemText 失败
查看>>
NSString NSMutableString
查看>>