通过反射实现圆角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 ...
随机推荐
- Eclipse和MyEclipse使用技巧--如何解决新建一个包的时候,工具帮生成了多个包的问题?
一.问题再现 二.如何解决
- 在大负载中使用LoadRunner进行负载测试()
在大负载中使用LoadRunner进行负载测试,需要配置一些环境来满足大负载下各种资源的充足: 1.为了避免出现“No Buffer Space Available”的错误,需要进行如下配置: 1)修 ...
- 【laravel5.*】运行 php artisan --version报错:PHP Parse error: syntax error, unexpected T_CLASS, expecting T_STRING or T_VARIABLE or '$' in /www/web/crm/artisan on line 31
1. 出现以上问题 是因为 php版本低于5.6, 因为我系统原有的默认php是5.3,装laravel的php是指定的5.6.21版本,所以在执行 laravel对应的php artisan . p ...
- [转载][Groovy] Groovy与Java的区别(一)
原文地址:[Groovy] Groovy与Java的区别(一)作者:langyizhao 因为Groovy可以用Java的所有功能(虽然JVM不同的时候可能会比较麻烦,比如在Android上),所以G ...
- [转]awesome-tensorflow-chinese
模型项目 Domain Transfer Network - Implementation of Unsupervised Cross-Domain Image Generation Show, At ...
- Linux命令之lsb_release - 查看当前系统的发行版信息
用途说明 lsb_release命令用来查看当前系统的发行版信息(prints certain LSB (Linux Standard Base) and Distribution informati ...
- YAML中重复的KEY的判断
package com.test.util; import java.io.BufferedReader; import java.io.FileInputStream; import java.io ...
- 如何打开Intellij IDEA的代码提示功能/联想/自动联想
1.默认情况下,我们输入代码时IDEA会自动弹出代码提示框,这时候是不用按快捷键的,直接使用方向键选择我们需要的条目就可以了. 2:如果我们想主动 使用代码提示时,默认的快捷键是CTRL+空格,但是中 ...
- ROS学习(七)—— 理解ROS Topic
一.准备工作 1.打开roscore roscore 2.turtlesim 打开一个turtulesim节点 rosrun turtlesim turtlesim_node 3.turtle key ...
- No package的问题解决
更新pecl扩展 yum install epel-release //扩展包更新包yum update //更新yum源