【Android】自己定义圆形ImageView(圆形头像 可指定大小)
2017-07-08 19:42
459 查看
近期在仿手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; } }
然后就能够直接像其它View一样直接在XML中使用了.
比如
<com.demos.tencent_qq_ui.CustomerView.AvatarImageView android:layout_width="96dip" <!--可自行指定大小--> android:layout_height="96dip" android:layout_centerHorizontal="true" android:src="@drawable/avatar" <!--这里放图片--> />
这样,在界面上显示的图像就是圆形的了.
只是我这里另一个不足的地方是没有检查原图片的大小,假设你放一张高清的图片,那就非常可能crash 掉.对于这点,我眼下的解决方法就是 Google 官方教程里的 Loading
Large Bitmaps Efficiently 但它的原理就是先不不把图片载入进来,而是先依据原图的大小计算缩放值,然后在依据缩放值读取图片(算是在读取的时候进行压缩吧....).可是这种方法须要提供视图ID,也就是说要给AvatarImageView 指定一个ID,然后一个AvatarImageView 要相应一个视图(我是这么理解的) 这种话AvatarImageView就无法重用了.当项目中多处要用到这个的话就会非常麻烦.
为此我在stackoverflow提了一个问,可是眼下还没有人回答T_T How
to make bitmap(set in src) compress?
【转载请注明出处】
Author: MummyDing
出处:http://blog.csdn.net/u012560612/article/category/5651761
相关文章推荐
- 【Android】自定义圆形ImageView(圆形头像 可指定大小)
- android 圆形imageview实现 带自定定义大小
- Android 自己定义ImageView实现圆角/圆形 附加OnTouchListener具体凝视以及Button圆角
- Android自定义ImageView,方角,圆角头像(可根据自己的需求来设定头像的圆角或者方角的大小)
- android圆形头像的实现类CircleImageView.java
- android 圆形头像的Imageview
- Android控件-圆形头像RoundedImageView
- android ImageView 设置圆形头像
- Android圆形头像图Circle ImageView
- 从原理上去理解圆形头像 Android ImageView圆形头像 图片完全解析
- Android ImageView圆形头像 图片完全解析
- Android使用CircleImageView实现圆形头像的方法
- Android开发圆形头像,RoundedImageView
- androidの自定义ImageView圆形头像
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- Android ImageView实现圆形头像
- android ImageView 实现圆形图片(QQ头像)
- Android ImageView圆形头像 图片完全解析
- Android 自定义ImageView, 圆形六边形头像