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

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;

}

@Override

protected 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 empty

mPath.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;

}

@Override

protected 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();

}

}

效果图如下:

[置顶] android 自定义ListView实现动画特效

通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...

[置顶] android 自定义TextView

系统自带的控件TextView有时候没满一行就换行了,为了解决这个问题,自定义了一个TextView,只有一行显示不完全的情况下才会去换行显示,代码如下: package com.open.textv ...

[置顶] Android开发笔记(成长轨迹)

分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

Android自定义圆角矩形进度条2

效果图: 或 方法讲解: (1)invalidate()方法 invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时, 调用invalidate()才 ...

[置顶] Android自定义控件大全

1,自定义Edittext, TextView,带底线的Edittext, TextView 2.自定义圆形ImageView,圆角ImageView 3,下拉刷新LinearLayout 4,多点触 ...

[置顶] Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏的时候的切换与显示

这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去 ...

[置顶] Android图片异步加载之Android-Universal-Image-Loader

将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

[置顶] Android布局管理器 - 详细解析布局实现

布局管理器都是以ViewGroup为基类派生出来的; 使用布局管理器可以适配不同手机屏幕的分辨率,尺寸大小; 布局管理器之间的继承关系 : 在上面的UML图中可以看出, 绝对布局 帧布局 网格布局 相 ...

[置顶] Android四大组件之BroadcastReceiver

Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...

随机推荐

iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

编写高效的js/jQuery代码 :rocket:

讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...

【转】自定义垂直的UISlider

原文网址:http://www.cocoachina.com/bbs/read.php?tid=96282 怎样自定义垂直的UISlider? UISlider弄成垂直的代码就是:slider.tra ...

Oracle的OFA架构

最优灵活体系结构(Optimal Flexible Architecture,简称OFA) OFA其实就是一种Oracle的一种规范,其意义就是用一种统一的给文件和文件夹的规则,和文件存放目录的规则做 ...

Android源代码下载之《Android新闻client源代码》

介绍 Android新闻client源代码,功能上分为:新闻.关注.读报.微博.里面比較有特色的就是读报功能.真正安装报纸的排版进行读报.给人得感觉就像是在读真实的报纸.事实上即使首页的动态云标签很有 ...

爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

本文由爱奇艺技术团队原创分享,原题. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Andro ...

python pip NameError:name 'pip' is not defined”

https://www.jianshu.com/p/f57f98ebcb21 问题: 如果直接在命令行里面输入pip或者pip3,提示:(如图1) “NameError:name 'pip' is n ...

局域网的路由器&网卡

网卡 唯一的标志 MAC地址:14:21:S8:8B:44:89 昵称:TP-Link-4489 如何获取局域网IP? DHCP(动态主机配置协议) DHCP 服务器可以动态的分配地址. 1)网卡(T ...

ABP框架入门踩坑-配置User Secrets

配置User Secrets ABP踩坑记录-目录 起因 因为以往习惯在User Secrets中保存连接字符串之类信息,但当我把连接字符串移到secrets.json中后,却发现在迁移过程中会报如下 ...

MySQL基础练习(三)

经过之前两次的学习,这次用MySQL进行略微复杂的操作练习 各部门工资最高的员工 首先创建表employee和表department.如下 我们需要查询每个部门工资最高的员工 select a.Nam ...

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

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

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

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

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

  3. android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法

    转载请注明出处: LouisWang http://blog.csdn.net/louiswangbing/article/details/6606865 相信对于广大Android应用开发爱好者来说 ...

  4. android listview item置顶,ListView的item置顶

    ListView的item设置置顶 1.activity public class TopListViewActivity extends Activity { private static int ...

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

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

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

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

  7. android imageview 加边框,RCImageView 自定义圆角ImageView,带边框效果

    概况 RCImageView 圆型或者圆角图片(带有边框效果),适配了ImageView的ScaleType属性 RoundImageView 定义圆角图片,四个角圆角弧度可各自定义,也可不定义默认角 ...

  8. [置顶] Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8749188  声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用, ...

  9. [置顶] Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite...

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

最新文章

  1. SAP启用检查双重Invoice功能
  2. 禁用内存清理_win10电脑开机内存占用高达80%以上如何解决
  3. 前端学习(1182):差值表达式
  4. Lua语言中pairs和ipairs的区别
  5. nprogress页面加载进度条
  6. android Camera相关问题及NV12剪裁旋转
  7. 损失函数、tensorflow2实现——Python实战
  8. 医用计算机考试题目,2015年全国计算机应医用能力考试辅导资料.doc
  9. 最优化方法:六、约束最优化方法
  10. 最小二乘支持向量机预测matlab实现,最小二乘支持向量机MATLAB程序,可分多类
  11. 网络安全系列-二十五: PCAP文件格式详解及读取PCAP文件源码示例
  12. nginx常用配置模板
  13. 记录从微信商户获取微信支付账单过程
  14. 笔记本电脑硬盘不见了_笔记本检测不到硬盘怎么办_电脑突然检测不到硬盘的解决方法-系统城...
  15. 遇见未来 | 对话叶毓睿:人类文明运行在软件之上(下篇)
  16. 《德鲁克管理思想精要》读书笔记
  17. 数字信息时代中国面临两个机遇
  18. 将数据表的纵向数据横向显示
  19. Modbus设备上云解决方案
  20. 学计算机的3个奋斗目标,我的学习方法和奋斗目标

热门文章

  1. 【第三篇:利用ChatGPT编写贪食蛇小游戏】
  2. 【读书札记】《北大授课》中华文化四十七讲 余秋雨
  3. 路飞学院 python_路飞学院-Python爬虫实战密训班-第1章
  4. 投资笔记4-投资风险认知
  5. postman导出,断言,批量执行
  6. 这个帖子记录一下java代码转换成易语言代码的坑[持续更新]
  7. vue尚品汇商城项目-day00【项目介绍:此项目是基于vue2的前台电商项目和后台管理系统】
  8. 计算机专业用学c4d吗,C4D软件学会要多久?学完后好就业吗?
  9. ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题
  10. 【2018-2019】咖啡般的生活,我们互相羡慕着彼此