Android自己定义圆角ImageView

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android自己定义圆角ImageView相关的知识,希望对你有一定的参考价值。

我们常常看到一些app中能够显示圆角图片。比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源。我们也能够自己通过程序实现的,以下介绍一个自己定义圆角ImageView的方法:

package com.yulongfei.imageview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.ImageView;

public class RoundAngleImageView extends ImageView {
	private int roundWidth = 13;
	private int roundHeight = 13;

	public RoundAngleImageView(Context context) {
		super(context);
		init(context, null);
	}

	public RoundAngleImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context, attrs);
	}

	public RoundAngleImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context, attrs);
	}

	private void init(Context context, AttributeSet attrs) {
		if (attrs != null) {
			TypedArray a = context.obtainStyledAttributes(attrs,
					R.styleable.RoundAngleImageView);
			roundWidth = a.getDimensionPixelSize(
					R.styleable.RoundAngleImageView_roundWidth, roundWidth);
			roundHeight = a.getDimensionPixelSize(
					R.styleable.RoundAngleImageView_roundHeight, roundHeight);
			a.recycle();
		} else {
			float density = context.getResources().getDisplayMetrics().density;
			roundWidth = (int)(roundWidth * density);
			roundHeight = (int)(roundHeight * density);
		}
	}

	/** 重写draw() */
	@Override
	public void draw(Canvas canvas) {
		
		//实例化一个和ImageView一样大小的bitmap
		Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
				Config.ARGB_8888);
		
		//实例化一个canvas,这个canvas相应的内存为上面的bitmap
		Canvas canvas2 = new Canvas(bitmap);
		if (bitmap.isRecycled()) {
			bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
					Config.ARGB_8888);
			canvas2 = new Canvas(bitmap);
		}
		
		//将imageView自己绘制到canvas2上,这个导致bitmap里面存放了imageView
		super.draw(canvas2);
		
		//利用canvas画一个圆角矩形,这个会改动bitmap的数据
		drawRoundAngle(canvas2);
		
		//将裁剪好的bitmap绘制到系统当前canvas上,这样裁剪好的imageview就能显示到屏幕上
		Paint paint = new Paint();
		paint.setXfermode(null);
		canvas.drawBitmap(bitmap, 0, 0, paint);
		bitmap.recycle();
	}

	public void setRoundWidth(int roundWidth, int roundHeight) {
		this.roundWidth = roundWidth;
		this.roundHeight = roundHeight;
	}

	private void drawRoundAngle(Canvas canvas)
	{
		Paint maskPaint = new Paint();
        maskPaint.setAntiAlias(true);
		maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        Path maskPath = new Path();  
        maskPath.addRoundRect(new RectF(0.0F, 0.0F, getWidth(), getHeight()), roundWidth, roundHeight, Path.Direction.CW);
        
        //这是设置了填充模式。很关键
        maskPath.setFillType(Path.FillType.INVERSE_WINDING);
        canvas.drawPath(maskPath, maskPaint);
	}
}


以上是关于Android自己定义圆角ImageView的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示

Android学习笔记圆角矩形ImageView自定义控件的实现与使用

Android自定义圆角矩形ImageView,支持Glide加载图片及颜色填充

Android自定义圆角矩形ImageView,支持Glide加载图片及颜色填充

Android 圆角、圆形 ImageView 实现

Xamarin Android 圆角边框与彩色 ImageView