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);
	}
}
时间: 2024-10-27 11:51:47

Android自己定义圆角ImageView的相关文章

Android自定义圆角ImageView

我们经常看到一些app中可以显示圆角图片,比如qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然如果没有圆角图片资源,我们也可以自己通过程序实现的,下面介绍一个自定义圆角ImageView的方法: package com.yulongfei.imageview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; impor

17 自定义属性及圆角imageView

1 public class RoundAngleImageView extends ImageView { 2 //cn.dpocket.moplusand.uinew是app的包名 manifest文件里面 3 private static final String NAMESPACE = "http://schemas.android.com/apk/res/cn.dpocket.moplusand.uinew"; 4 private Paint paint; 5 //如果不在x

Android 自己定义ViewGroup手把手教你实现ArcMenu

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这种UI效果,感觉非常不错,后来知道github上有这么个开源项目~~~~当然本篇不是教你怎样使用这个开源项目,而是教你怎样自己通过自己定义ViewGroup写这种效果,自己定义ViewGroup也是我的痛楚.嘿嘿.希望以此能够抛砖引玉~~ 效果图: 1.实现思路 通过效果图,会有几个问题: a.动画效果怎样实现 能够看出动画是从顶点外外发射的,可能有

Android实习札记(10)---ImageView的src属性 VS blackground属性

Android实习札记(10)---ImageView的src属性 VS blackground属性                                                                              转载请注明出处:coder-pig 问题分析 相信大家对于ImageView图片组件并不陌生吧,见名知意,就是用来显示图片的咯! 而显示图片的话可以通过src属性,又或者blackground属性来进行设置! 这些大家都知道,但是有没有去纠结下

Android 自己定义控件实现刮刮卡效果 真的就仅仅是刮刮卡么

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 非常久以前也过一个html5的刮刮卡效果~~上次看到有人写Android的刮刮卡效果~~于是乎产生了本篇博客~~此类样例也比較多了,大家能够百度看看~只是还是通过本样例,带大家发掘一下.里面隐含的知识~ 1.Xfermode以及PorterDuff 假设大家还记得,以前在博客:完美实现图片圆角和圆形 简介过圆角的实现原理也是基于这个

Android自己定义组件系列【5】——进阶实践(2)

上一篇<Android自己定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一篇我们来看看ExpandableListView的使用并实现剩下的部分. 原文出处:http://blog.csdn.net/singwhatiwanna/article/details/25546871 一.ExpandableListView的使用方法 ExpandableListView是ListVi

android 自己定义控件

Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs.xml. 在当中定义你的属性. 在使用到自己定义View的xml布局文件里须要增加xmlns:前缀="http://schemas.android.com/apk/res/你的应用所在的包路径". 在使用自己定义属性的时候.使用前缀:属性名,如my:textColor="#FF

Android UI--自定义ListView(实现下拉刷新+加载更多)

http://blog.csdn.net/wwj_748/article/details/12512885 Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈:

Android 实现对话框圆角功能

Android 实现自定义dialog圆角功能 刚接触公司的Android项目,客户画好了界面,需求如下: 弹出的窗口是要四个圆角,并且标题栏颜色和下方不一样,还要以蓝色线分隔开,通过网上各种百度,给出的方案基本上是在/drawable文件夹下建立一个shape文件,里面对控件进行一些控制.(这里要注意的是shape文件应该是放在drawable文件夹下,至于为什么要放到这里,以及根元素下的各种元素用法,请参考这位前辈的博客:http://blog.csdn.net/lonelyroamer/a