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; }}

更多相关文章

  1. Android ImageView设置长度高度为wrap_content时高度根据图片比
  2. Android实现获取本机中所有图片
  3. 基于Android的图像处理演示软件介绍文档
  4. Android中实现网络图片的获取
  5. AsyncTask异步下载图片
  6. Android图片加载框架Picasso最全使用教程 一
  7. android checkbox 未选中状态 已选中状态 替换成自己的图片
  8. Android 图像按钮ImageButton

随机推荐

  1. Android应用程序消息处理机制(Looper、Han
  2. Retrofit的简单使用
  3. Android(安卓)Zygote
  4. 分享一个好用的Android投屏工具-scrcpy
  5. Android(安卓)轮询最佳实践 Service + Al
  6. Android高手进阶教程(二)之----Android(
  7. android加载网络图片(逐行扫描格式png图
  8. Android属性系统
  9. 从零开始学android:Android中的基本控件(
  10. 根据css背景图属性+css定位制作雪碧图效