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

最新文章

  1. 如何禁止内部viewPager滑动
  2. 循环获取DataTable
  3. python之简单POST模拟登录
  4. C#之数据分页
  5. HDU 2896
  6. QQ微信与智能家电连接一起 小马哥"连接一切"野心凸显
  7. 开扒php内核函数,第三篇 implode
  8. 给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析
  9. Docker快速搭建neural style环境
  10. HTML——博客页面布局
  11. Git版本控制管理教程(一):介绍
  12. 第二次Srum冲刺
  13. Zookeeper注册中心和Dubbo-Admin管理平台的搭建
  14. SSM框架接收处理安卓端的json数据
  15. Java基础恶补——内存泄露、内存溢出
  16. VS调试dll详细过程记录
  17. echarts.js制作中国地图
  18. BZOJ2085 : [Poi2010]Hamsters
  19. nyoj 幸运三角形
  20. echarts隐藏之后的显示问题

热门文章

  1. shell脚本举例
  2. 爬虫开发python工具包介绍 (4)
  3. python---类接口技术
  4. [转]常见linux命令用法介绍
  5. 【JavaScript 7—基础知识点】:BOM
  6. 安卓ImageView.src设置图片拉伸、填满控件的方法
  7. MapReduce和Hadoop流
  8. SPOJ 375 Query on a tree【树链剖分】
  9. 【基础操作】FFT / DWT / NTT / FWT 详解
  10. django 和 mongdb 写一个简陋的网址,以及用django内置的分页功能