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 stub
init();
}
public ImageCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init();
}
public ImageCircleView(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
public void init() {
paint = new Paint();
}
@Override
protected void onDraw(Canvas cns) {
// TODO Auto-generated method stub
Drawable 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;
}
}