Android自己定义圆形ImageView(圆形头像 可指定大小)
Posted cynchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android自己定义圆形ImageView(圆形头像 可指定大小)相关的知识,希望对你有一定的参考价值。
近期在仿手Q的UI,这里面常常要用到的就是圆形头像,看到 在android中画圆形图片的几种办法 这篇文章,了解了制作这样的头像的原理.只是里面提供的方法另一个不足的地方就是不能依据实际需求改变图片的大小,也就是说提供的原图是大尺寸的,转换之后的图片也是大尺寸的,这显然不符合我们实际项目中的需求.于是我对里面介绍的第一种方法做了一番改进,使其能直接在XML中指定图片的大小.
大体步骤
- 将原图居中裁剪成正方形
- 依据指定的宽度对正方形进行缩放
- 裁剪成圆形
效果
代码实现
package com.demos.tencent_qq_ui.CustomerView; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; /** * Created by mummyding on 15-8-7. */ public class AvatarImageView extends ImageView { private Paint paint = new Paint(); public AvatarImageView(Context context) { super(context); } public AvatarImageView(Context context, AttributeSet attrs) { super(context, attrs); } public AvatarImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } //将头像按比例缩放 private Bitmap scaleBitmap(Bitmap bitmap){ int width = getWidth(); //一定要强转成float 不然有可能由于精度不够 出现 scale为0 的错误 float scale = (float)width/(float)bitmap.getWidth(); Matrix matrix = new Matrix(); matrix.postScale(scale, scale); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } //将原始图像裁剪成正方形 private Bitmap dealRawBitmap(Bitmap bitmap){ int width = bitmap.getWidth(); int height = bitmap.getHeight(); //获取宽度 int minWidth = width > height ?height:width ; //计算正方形的范围 int leftTopX = (width - minWidth)/2; int leftTopY = (height - minWidth)/2; //裁剪成正方形 Bitmap newBitmap = Bitmap.createBitmap(bitmap,leftTopX,leftTopY,minWidth,minWidth,null,false); return scaleBitmap(newBitmap); } @Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (null != drawable) { Bitmap rawBitmap =((BitmapDrawable)drawable).getBitmap(); //处理Bitmap 转成正方形 Bitmap newBitmap = dealRawBitmap(rawBitmap); //将newBitmap 转换成圆形 Bitmap circleBitmap = toRoundCorner(newBitmap, 14); final Rect rect = new Rect(0, 0, circleBitmap.getWidth(), circleBitmap.getHeight()); paint.reset(); //绘制到画布上 canvas.drawBitmap(circleBitmap, rect, rect, paint); } else { super.onDraw(canvas); } } private Bitmap toRoundCorner(Bitmap bitmap, int pixels) { //指定为 ARGB_4444 能够减小图片大小 Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_4444); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Rect rect = new Rect(0, 0,bitmap.getWidth(), bitmap.getHeight()); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); int x = bitmap.getWidth(); canvas.drawCircle(x / 2, x / 2, x / 2, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } }
<com.demos.tencent_qq_ui.CustomerView.AvatarImageView android:layout_width="96dip" <!--可自行指定大小--> android:layout_height="96dip" android:layout_centerHorizontal="true" android:src="@drawable/avatar" <!--这里放图片--> />
以上是关于Android自己定义圆形ImageView(圆形头像 可指定大小)的主要内容,如果未能解决你的问题,请参考以下文章
Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示