自定义ImageView实现圆形头像
2016-05-27 12:24
381 查看
java代码如下:
只需在布局中将该java文件作为控件在布局中使用即可,支持Bitmap设置。
只需在布局中将该java文件作为控件在布局中使用即可,支持Bitmap设置。
package com.yan.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.PorterDuff.Mode; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; 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; public class CustomImageView extends ImageView { /** * 三个构造方法 */ public CustomImageView(Context context) { super(context); // TODO Auto-generated constructor stub } public CustomImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public CustomImageView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } /** * 绘制图形的onDraw方法 */ @Override protected void onDraw(Canvas canvas) { Drawable draw = getDrawable(); // 空值判断,必要步骤,避免由于没有设置src 导致的异常错误 if (draw == null) { return; } // 必要步骤,避免由于初始化之前导致的异常错误 /** * 获取 宽高,若获得不到宽高,则直接结束流程 */ if (getWidth() == 0 || getHeight() == 0) { return; } /** * 判断该对象是否是BitmapDrawable或其子类的实例 */ if (!(draw instanceof BitmapDrawable)) { return; } Bitmap b = ((BitmapDrawable) draw).getBitmap(); if (null == b) { return; } Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); int w = getWidth(); int h = getHeight(); Bitmap roundBitmap = getCroppedBitmap(bitmap, w); canvas.drawBitmap(roundBitmap, 0, 0, null); } /** * 初始化Bitmap对象的缩放裁剪过程 * * @param bmp * 初始化Bitmap对象 * @param radius * 圆形图片致敬大小 * @return 返回一个圆形的缩放裁剪过后的Bitmap对象 */ public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) { Bitmap sbmp; // 比较初始Bitmap宽高和给定的圆形直径,判断是否需要缩放裁剪Bitmap对象 if (bmp.getWidth() != radius || bmp.getHeight() != radius) { sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false); } else { sbmp = bmp; } Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); Paint paint = new Paint(); Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight()); // 抗锯齿 paint.setAntiAlias(true); // 获取更清晰的图像采样 paint.setFilterBitmap(true); // 防抖动 paint.setDither(true); // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色的定义 paint.setColor(Color.parseColor("#BAB399")); /** * //设置为本缩放倍数 * paint.setTextScaleX(float scaleX); * //设置下划线 * paint.setUnderlineText(boolean underlineText); * //设置alpha不透明度,范围为0~255 * paint.setAlpha(int a); * //设置 Paint对象颜色,参数一为alpha透明值 * paint.setARGB(int a, int r, int g, int b); */ // 将会以颜色ARBG填充整个控件的Canvas背景 canvas.drawARGB(0, 0, 0, 0); canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f, sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint); /** * 核心部分,设置两张图片的相交模式,这里就是上面绘制的Circle和下面绘制的Bitmap * * 系统提供的Xfermode子类有三个: * * AvoidXfermode : * 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。 * * PixelXorXfermode : * 当覆盖已有的颜色时,应用一个简单的像素XOR操作。 * * PorterDuffXfermode : * 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条PorterDuff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。 * * canvas原有的图片就是北京,既dst,新画上去的图片就是前景src * */ paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(sbmp, rect, rect, paint); return output; } }
相关文章推荐
- Android打造带透明圆弧的ImageView
- Android编程UI设计之GridView和ImageView的用法
- 基于Android实现随手指移动的ImageView
- Android使用ImageView 制作透明圆弧实例代码
- Android中ImageView用法实例分析
- Android使用控件ImageView加载图片的方法
- Android程序开发之动态设置ImageView的亮度
- Android实现GridView中ImageView动态变换的方法
- Android控件之ImageView用法实例分析
- 实例解析Android ImageView的scaleType属性
- Android UI之ImageView实现图片旋转和缩放
- 图文讲解Android的ImageView类中的ScaleType属性设置
- Android手势滑动实现ImageView缩放图片大小
- Android编程实现ImageView图片抛物线动画效果的方法
- Android编程简单实现ImageView点击时背景图修改的方法
- android ImageView 的几点经验总结
- Android控件系列之ImageView使用方法
- Android中通过反射实现圆角ImageView代码实例
- Android实现手势控制ImageView图片大小
- Android开发之imageView图片按比例缩放的实现方法