码迷,mamicode.com
首页 > 移动开发 > 详细

Android自己定义圆角ImageView

时间:2017-05-13 17:02:54      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:article   介绍   圆角   long   view   float   联系   int   creat   

我们常常看到一些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

标签:article   介绍   圆角   long   view   float   联系   int   creat   

原文地址:http://www.cnblogs.com/jhcelue/p/6849149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!