Android 圆形头像显示
16lz
2021-01-23
github源码在https://github.com/apple317/displayview。
Android在api中没有直接显示圆形图片的组件,要重写一个ImageView组件:
实现基本思想在通过getDrawable()得到ImageView图片对象,然后在OnDraw方法中用Canvas绘画一个位图,并去掉锯齿,并画一个圆形图层,用PorterDuffXfermode合并图像。
在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。
下面的Xfermode子类可以改变这种行为:
AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。
PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
public class ImageCircleView extends ImageView {Path path;public PaintFlagsDrawFilter mPaintFlagsDrawFilter;// 毛边过滤Paint paint;public ImageCircleView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinit();}public ImageCircleView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinit();}public ImageCircleView(Context context) {super(context);// TODO Auto-generated constructor stubinit();}public void init() {paint = new Paint();}@Overrideprotected void onDraw(Canvas cns) {// TODO Auto-generated method stubDrawable drawable = getDrawable();if (null != drawable) {Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();Bitmap b = circleDraw(bitmap);final Rect rect1 = new Rect(0, 0, b.getWidth(), b.getHeight());final Rect rect2 = new Rect(0, 0, getMeasuredWidth(), getMeasuredHeight());paint.reset();cns.drawBitmap(b, rect1, rect2, paint);b.recycle();} else {super.onDraw(cns);}}private Bitmap circleDraw(Bitmap bitmap) {int r=0;int width = bitmap.getWidth();int height = bitmap.getHeight();Rect rectSource = null;if(width>height)r=height;else{r=width;}//创建一个图片对象Bitmap output = Bitmap.createBitmap(r, r, Config.ARGB_8888);//创建一个图片游标Canvas canvas = new Canvas(output); final Rect rect = new Rect(0, 0, r, r); /* 设置取消锯齿效果 */ paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(Color.WHITE); /* 绘画一个圆图形 */ canvas.drawCircle(r/ 2, r / 2, r / 2, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }}
更多相关文章
- Android ImageView设置长度高度为wrap_content时高度根据图片比
- Android实现获取本机中所有图片
- 基于Android的图像处理演示软件介绍文档
- Android中实现网络图片的获取
- AsyncTask异步下载图片
- Android图片加载框架Picasso最全使用教程 一
- android checkbox 未选中状态 已选中状态 替换成自己的图片
- Android 图像按钮ImageButton