Android 圆形头像显示

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值