【Android】自定义圆形ImageView(圆形头像 可指定大小)
来源:互联网 发布:网络授课平台哪个好 编辑:程序博客网 时间:2024/05/17 11:07
最近在仿手Q的UI,这里面经常要用到的就是圆形头像,看到 在android中画圆形图片的几种办法 这篇文章,了解了制作这种头像的原理.不过里面提供的方法还有一个不足的地方就是不能根据实际需求改变图片的大小,也就是说提供的原图是大尺寸的,转换之后的图片也是大尺寸的,这显然不符合我们实际项目中的需求.于是我对里面介绍的第一种方法做了一番改进,使其能直接在XML中指定图片的大小.
大体步骤
- 将原图居中裁剪成正方形
- 根据指定的宽度对正方形进行缩放
- 裁剪成圆形
首先是java代码:
package com.zdsoft.blp.zidingyikongjian;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 Administrator on 2017/4/22. */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; }}
然后就可以直接像其他View一样直接在XML中使用了.例如<com.zdsoft.blp.zidingyikongjian.AvatarImageView android:id="@+id/iv_touxiang" android:layout_width="180px" android:layout_height="190px" android:layout_gravity="center" android:layout_margin="30px" android:src="@drawable/wd_del" />
这样,在界面上显示的图像就是圆形的了.
0 0
- 【Android】自定义圆形ImageView(圆形头像 可指定大小)
- 【Android】自定义圆形ImageView(圆形头像 可指定大小)
- android 圆形头像 自定义ImageView
- Android头像ImageView圆形
- androidの自定义ImageView圆形头像
- Android 自定义ImageView, 圆形六边形头像
- android自定义圆形头像view,继承imageview
- Android 简易 自定义ImageView 实现圆形头像
- 自定义ImageView实现圆形头像
- 自定义ImageView实现圆形头像
- android 圆形头像的Imageview
- Android ImageView实现圆形头像
- Android自定义圆形头像
- android自定义圆形头像
- Android 自定义圆形头像
- Android自定义圆形头像
- Android 自定义圆形头像
- Android 自定义圆形头像
- 线性降维-笔记(2)
- How to Write Doc Comments for the Javadoc Tool
- 1067.试密码(20)
- 透明网关
- 王爽-汇编语言第三版实验7
- 【Android】自定义圆形ImageView(圆形头像 可指定大小)
- gitlab无法push或clone的错误:JWT::DecodeError (Nil JSON web token): lib/gitlab/workhorse.rb:120:in `verify_
- mysql中key 、primary key 、unique key 与index区别
- 选择排序——简单选择排序
- linux 内核设备驱动初始化的实现(转)
- 在Ubuntu 16.04 安装sogou 输入法详细讲解
- jQuery选择器
- /lib64/libc.so.6: version `GLIBC_2.14' not found
- 知识点1:你是怎么理解面向对象和面向过程的