通过反射实现圆角ImageView
private void init(){
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundRect = new RectF(, , getWidth() , getHeight());
radius = ;
mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ;
}
继承ImageView,在构造方法中调用,初始化Paint和Xfermode。
protected void onDraw(Canvas canvas) {
int sc = canvas.saveLayer(, , getWidth() , getHeight(), null,
Canvas.MATRIX_SAVE_FLAG |
Canvas.CLIP_SAVE_FLAG |
Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
Canvas.CLIP_TO_LAYER_SAVE_FLAG);
roundRect.set(, , getWidth(), getHeight());
canvas.drawRoundRect(roundRect, radius, radius, paint);
reflectSetXfermod();
super.onDraw(canvas);
canvas.restoreToCount(sc);
}
重写ImageView的onDraw方法,通过xfermode实现圆角
private void reflectSetXfermod(){
Drawable drawable = getDrawable();
if(drawable == null){
return;
}
Class bsClass = null;
Class[] innerClasses = BitmapDrawable.class.getDeclaredClasses();
for(Class innerClass :innerClasses)
{
String name = innerClass.getName();
System.out.println("-----innerClass---"+name);
if(name.equals("android.graphics.drawable.BitmapDrawable$BitmapState"))
{
bsClass = innerClass;
}
}
if(bsClass!= null){
try {
Field mPaintField = bsClass.getDeclaredField("mPaint");
mPaintField.setAccessible(true);
ConstantState constantState = ((BitmapDrawable)drawable).getConstantState();
Paint paint = (Paint)mPaintField.get(constantState);
paint.setXfermode(mPorterDuffXfermode);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通过反射的方法将xfermode设置到BitmapDrawable 里面的内部类BitmapState里的对象mPaint,用来绘制图片。
通过反射实现圆角ImageView的更多相关文章
- 自定义控件之 圆形 / 圆角 ImageView
一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...
- Android自己定义圆角ImageView
我们常常看到一些app中能够显示圆角图片.比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源.我们也能够自己通过程序实现的,以下介绍一个自己定义圆角Imag ...
- Android自己定义圆角ImageView 支持网络图片
先看下效果图 我们再来看一张CSDN的圆角图片 从布局能够看出csdn app 的头像也是圆角的Image,但能够看到.有明显的毛刺感.不知道是csdn 程序猿的疏忽还是 我手机的问题,本人手机(小米 ...
- android 圆角 ImageView
android中Imageview 内的图片圆角的实现方式 此文针对的是 imageview中图片的圆角, 即忽略掉图片的ScaleType, 均对图片采取圆角. 而不是对Imageview本身的圆 ...
- 自定义圆角ImageView控件
这个就当工具类用吧,因为直接是继承的ImageView.所以也具备了ImageView所有的特点,不同的是,可以自动裁剪成圆角图片.看效果吧. 效果还是不错的.使用方式: 直接在配置中添加依赖 com ...
- [置顶] android 自定义圆角ImageView以及锯齿的处理
看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...
- android 圆角ImageView类,可设置弧度
public class RoundImageView extends ImageView { private Paint paint; private int roundWidth = 50; pr ...
- iOS 图片文件格式判断、圆角图片
1.圆角图片 // 设置圆形图片(放到分类中使用) - (UIImage *)cutCircleImage { UIGraphicsBeginImageContextWithOptions(self. ...
- iOS设置圆角的常用方法
//第一种方法:最常用的方法,但是性能最差 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100 ...
随机推荐
- Web前端知识体系
看到一篇不错的文章,拿来收藏和分享. 原文:http://mp.weixin.qq.com/s/UFTfdE7LYhHquWEzwZKLCQ Web前端技术由html.css和 javascript三 ...
- 图像检索:一维直方图+欧几里得距离+flann+KNN
在F盘生成了一个文件名称为"文件夹"的文本文件. 第一步:批处理提取图像的一维颜色直方图,并保存到.xml中的featureHists 第一个參数:图像的路径 第二个參数:保存的. ...
- 用dockerfile构建基于centos系统的jar包的镜像
实际示例: [root@master01 home-dataline]# ls dataline.jar Dockerfile jdk-8u181-linux-x64.tar.gz [root@mas ...
- Mac巧用AirDrop实现大文件传输
最近想更新一下Xcode8.3,无奈资源太大,不想一点点下载了,公司服务器上正好有官网下载好的,就想直接拿过来使用,本来想通过QQ传输的,无奈发现QQ传输提示资源过大. 于是就想到了这货:AirDro ...
- 用Java发起HTTP请求与获取状态码(含状态码列表)
转自:https://blog.csdn.net/xyw591238/article/details/51072697 在使用Java请求Web程序比如访问WebService接口时,通常需要先判断访 ...
- Xcode 8 的 Debug 新特性 —- WWDC 2016 Session 410 & 412 学习笔记
Contents OverView Static Analyzer Localizability Instance Cleanup Nullablility Runtime Issue View De ...
- libev ev_init分析
/* these may evaluate ev multiple times, and the other arguments at most once */ /* either use ev_in ...
- vim缩进参考线
编辑缩进嵌套的文件时想找到对应的层级比较困难,写了一个函数,使用cc选项设定一条辅助线,标识到指定的缩进层级.代码如下: ? ReferenceLine 1 2 3 4 5 6 7 8 9 10 11 ...
- xtrabackup部分备份数据库 Partial Backups
官方文档: 部分备份: http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/partial_backups_innobacku ...
- windows7 sqlserver2012 无法写入受保护的内存 解决办法
1.我服务器 是windows server 2008R2 装的是MSSQLSERVER2012 2.客户端开发是MSSQLSERVER2012 Windows7 遇到问题: 解决办法: 卸载迅雷 ...