看到很多人开发过程中要使用圆角图片时,解决方法有:

1.重新绘制一张图片

2.通过布局来配置

3.通过重写View来实现

其中1,2在这里就不讲了,重点讲讲方法三的实现。

实现一:通过截取画布一个圆形区域与图片的相交部分进行绘制,缺点:锯齿明显,设置Paint,Canvas抗锯齿无效。

package com.open.circleimageview.widget;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.View;public class CircleImageViewA extends View {public CircleImageViewA(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public CircleImageViewA(Context context, AttributeSet attrs) {super(context, attrs);}public CircleImageViewA(Context context) {super(context);}private Bitmap bitmap;private Rect bitmapRect=new Rect();private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);private Paint paint = new Paint();{paint.setStyle(Paint.Style.STROKE);paint.setFlags(Paint.ANTI_ALIAS_FLAG);paint.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了 }private Path mPath=new Path();public void setImageBitmap(Bitmap bitmap){this.bitmap=bitmap;}@Overrideprotected void onDraw(Canvas canvas) {if(null==bitmap){return;}bitmapRect.set(0, 0, getWidth(), getHeight());canvas.save();canvas.setDrawFilter(pdf);mPath.reset();canvas.clipPath(mPath); // makes the clip emptymPath.addCircle(getWidth()/2, getWidth()/2, getHeight()/2, Path.Direction.CCW);canvas.clipPath(mPath, Region.Op.REPLACE);canvas.drawBitmap(bitmap, null, bitmapRect, paint);canvas.restore();}}

实现二:通过PorterDuffXfermode 方式(注意要设置硬件加速,否则部分机子无效),优点:锯齿基本没有

package com.open.circleimageview.widget;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;public class CircleImageViewB extends View {public CircleImageViewB(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public CircleImageViewB(Context context, AttributeSet attrs) {super(context, attrs);init();}public CircleImageViewB(Context context) {super(context);init();}private Bitmap bitmap;private Rect bitmapRect=new Rect();private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);private Paint paint = new Paint();{paint.setStyle(Paint.Style.STROKE);paint.setFlags(Paint.ANTI_ALIAS_FLAG);paint.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了 }private Bitmap mDstB=null;private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);private void init(){try {if(android.os.Build.VERSION.SDK_INT>=11){setLayerType(LAYER_TYPE_SOFTWARE, null);}} catch (Exception e) {e.printStackTrace();}}public void setImageBitmap(Bitmap bitmap){this.bitmap=bitmap;}private Bitmap makeDst(int w, int h) {Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(bm);Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);p.setColor(Color.parseColor("#ffffffff"));   c.drawOval(new RectF(0, 0, w, h), p);return bm;}@Overrideprotected void onDraw(Canvas canvas) {if(null==bitmap){return;}if(null==mDstB){mDstB=makeDst(getWidth(), getHeight());}bitmapRect.set(0, 0, getWidth(), getHeight());canvas.save();canvas.setDrawFilter(pdf);canvas.drawBitmap(mDstB, 0, 0, paint);paint.setXfermode(xfermode);canvas.drawBitmap(bitmap, null, bitmapRect, paint);paint.setXfermode(null);canvas.restore();}}

效果图如下:

代码地址:http://download.csdn.net/detail/zz7zz7zz/6240225

转载于:https://www.cnblogs.com/suncoolcat/p/3313357.html

[置顶] android 自定义圆角ImageView以及锯齿的处理相关推荐

  1. android imageview 锯齿,[置顶] android 自定义圆角ImageView以及锯齿的处理

    看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...

  2. android imageview 锯齿,android 自定义圆角ImageView以及锯齿的处理

    看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...

  3. 安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例

    安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例,图片压缩处理逻辑 本文旨在介绍自定义View的实现 ...

  4. android listview标题置顶,Android仿QQ左滑删除置顶ListView操作

    最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...

  5. [置顶] Android自定义控件 芝麻信用分雷达图

    [置顶] Android自定义控件 芝麻信用分雷达图 标签: android自定义雷达芝麻信用 2016-10-23 20:11  3548人阅读  评论(24)  收藏  举报   分类: 自定义控 ...

  6. Android自定义圆角边框

    Android自定义圆角边框 一. 说明 本文主要讲如何自定义一个圆角的边框 二. 所用工具 Android Studio 三. 内容 1. 涉及到的内容 solid:设置背景色 stroke:设置边 ...

  7. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  8. android自定义圆角进度条,Android自定义进度条的圆角横向进度条实例详解

    1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色, ...

  9. Android 自定义圆角布局

    在android 开发中,图片或者button 有圆角的布局显得格外的美观些,所以今天就来 自定义圆角布局,只要把控件放入圆角布局中,然后设置属性就能实现圆角布局样式 接下来就来实现这样的功能 效果图 ...

最新文章

  1. mysql主从库配置ps:mysql5.6
  2. 了解 NoSQL 的必读资料
  3. c 指定端口连接mysql_c++连接mysql(MYSQL C api使用)
  4. 02_pyplot.plot函数、回顾第一个例子、格式字符串、plot函数、线型风格字符、标记(marker)字符、颜色字符
  5. java nginx 例子_Nginx配置日志
  6. 程序默认在副屏显示_聊一款性价比极高的电竞显示器
  7. apache mediawiki 安装_如何在CentOS 7上安装MediaWiki
  8. Java BigDecimal stripTrailingZeros()方法与示例
  9. [vue] vue如何监听键盘事件?
  10. php输入数据提交排序,排序php数据var
  11. git eclipse 取消误操作 ignore(忽略)文件
  12. js实现数据流(日志流,报警信息等)滚动展示,并分页(含实现demo)
  13. fzu 2077 The tallest tree
  14. MySQL(八)事务的隔离级别
  15. 联系人存储ContactsProvider表分析
  16. win10时间不准_简单几招教会你win10系统时间不准怎么解决
  17. 数组分割 java_分割java数组
  18. ctc系统通信前置服务器,CTC系统包括哪些接口服务器?
  19. *16.5 shared_ptr使用场景、陷阱、性能分析与使用建议
  20. python打印列表的下标和值的例子:

热门文章

  1. ubuntu安装vasp_用强大的GROMACS分析工具分析VASP的动力学结果
  2. 最大子段和动态规划_动态规划解决最大正方形问题
  3. python怎么创意出字符图形_创造课程系列:Python入门
  4. java过滤器命名_JAVA过滤器的使用(Filter)
  5. ue4vr插件_UE4 含源码插件合集【转载】
  6. mysql显示错误代码1067_每日一记--Mysql错误代码1067
  7. 如何用php饼型图,php绘制饼状图的代码举例
  8. 5导出word_重磅更新 !支持题库导出为word
  9. aliyun maven 添加jar_Maven介绍及安装
  10. java volatile 基本类型_Java中Volatile关键字详解(转)