android中Imageview 内的图片圆角的实现方式

此文针对的是 imageview中图片的圆角, 即忽略掉图片的ScaleType, 均对图片采取圆角.  而不是对Imageview本身的圆角.

处理方式分两大类(暂不讨论具体的实现方式)

  1. 传入图片前将图片圆角化.
  2. 传入图片之后在绘制过程中进行圆角化处理.

两种实现方式各有优劣.

  第一种实现方式在于每次调用之前需要对原图进行圆角化处理, 图片处理一般是比较耗时的操作(大图片比较明显), 而且处理完成后原图就本身带圆角, 不利于获取原来的图片, 此方法同时也是优势.....(无视那些保存原图的小伙伴.....)

  第二种方式. 优势在于不需要对图片额外处理, 只需要执行正常的调用逻辑,  是在图片绘制中进行额外处理, 所以时间耗费比方法一少. 不过此种方法处理过的图形本身不带圆角, 只是显示中才有圆角. 而且此种方法实现过程中难点在于获取图片在imageview中的显示位置.

方法二:

  步骤一, 对图片的绘制过程进行控制, 需要计算出 imageview 中的图片的显示位置, 然后根据位置进行圆角绘制.

  根据imageview中图片的scaletype 不一样, 动态的计算图像在imageview中的位置.  核心代码如下

  

     private RectF genBounds() {
RectF ret = new RectF(0, 0, 0, 0); if (getDrawable() == null) {
return ret;
} int dwidth = getDrawable().getIntrinsicWidth();
int dheight = getDrawable().getIntrinsicHeight(); int vwidth = getWidth() - getPaddingLeft() - getPaddingRight();
int vheight = getHeight() - getPaddingTop() - getPaddingBottom(); boolean fits = (dwidth < 0 || vwidth == dwidth) &&
(dheight < 0 || vheight == dheight); if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == getScaleType()) {
ret.right = vwidth;
ret.bottom = vheight;
} else {
ret = new RectF(0, 0, dwidth, dheight); if (ScaleType.MATRIX == getScaleType()) {
// Use the specified matrix as-is.
} else if (fits) {
} else if (ScaleType.CENTER == getScaleType()) {
ret.offset((int) ((vwidth - dwidth) * 0.5f + 0.5f),
(int) ((vheight - dheight) * 0.5f + 0.5f));
} else if (ScaleType.CENTER_CROP == getScaleType()) { float scale;
float dx = 0, dy = 0; if (dwidth * vheight > vwidth * dheight) {
scale = (float) vheight / (float) dheight;
dx = (vwidth - dwidth * scale) * 0.5f;
} else {
scale = (float) vwidth / (float) dwidth;
dy = (vheight - dheight * scale) * 0.5f;
} ret.offset((int) (dx + 0.5f), (int) (dy + 0.5f));
} else if (ScaleType.CENTER_INSIDE == getScaleType()) {
float scale;
int dx;
int dy; if (dwidth <= vwidth && dheight <= vheight) {
scale = 1.0f;
} else {
scale = Math.min((float) vwidth / (float) dwidth,
(float) vheight / (float) dheight);
} dx = (int) ((vwidth - dwidth * scale) * 0.5f + 0.5f);
dy = (int) ((vheight - dheight * scale) * 0.5f + 0.5f); ret.offset(dx, dy);
}
} if (ret.left < getPaddingLeft())
ret.left = getPaddingLeft(); if (ret.right > vwidth + getPaddingLeft())
ret.right = vwidth + getPaddingLeft(); if (ret.top < getPaddingTop()) ret.top = getPaddingTop(); if (ret.bottom > vheight + getPaddingTop())
ret.bottom = vheight + getPaddingTop(); return ret;
}

  步骤二: 对图片的绘制进行处理.

  

     private int cornerColor = Color.WHITE;
private boolean usrRoundCorner = true;
private Path mMaskPath = new Path(); private void initPaint() {
if (mPaint == null) {
mPaint = new Paint();
mPaint.setColor(getCornerColor());
mPaint.setStrokeWidth(3);
mPaint.setAntiAlias(true);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
} Paint mPaint;
float mCornerRadius = getResources().getDisplayMetrics().density * 3 + 0.5f;
float[] radii = new float[]{mCornerRadius, mCornerRadius, mCornerRadius, mCornerRadius, mCornerRadius, mCornerRadius, mCornerRadius, mCornerRadius}; @Override
protected void onDraw(Canvas canvas) {
int saveCount = canvas.saveLayerAlpha(0F, 0F, canvas.getWidth(), canvas.getHeight(), 255, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
super.onDraw(canvas); if (usrRoundCorner) {
RectF bounds = genBounds(); mMaskPath.reset();
mMaskPath.addRoundRect(bounds, radii, Path.Direction.CW);
mMaskPath.setFillType(Path.FillType.INVERSE_WINDING); canvas.drawPath(mMaskPath, mPaint);
}
canvas.restoreToCount(saveCount);
}

核心代码都在上面了.  大家有其他方法也可以留言告诉我.

android 圆角 ImageView的更多相关文章

  1. android 圆角ImageView类,可设置弧度

    public class RoundImageView extends ImageView { private Paint paint; private int roundWidth = 50; pr ...

  2. Android自己定义圆角ImageView

    我们常常看到一些app中能够显示圆角图片.比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源.我们也能够自己通过程序实现的,以下介绍一个自己定义圆角Imag ...

  3. Android自己定义圆角ImageView 支持网络图片

    先看下效果图 我们再来看一张CSDN的圆角图片 从布局能够看出csdn app 的头像也是圆角的Image,但能够看到.有明显的毛刺感.不知道是csdn 程序猿的疏忽还是 我手机的问题,本人手机(小米 ...

  4. 自定义控件之 圆形 / 圆角 ImageView

    一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的:       二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...

  5. Android 圆角的效果实现

    Android 自定义ImageView实现圆角图片昨天给学生布置作业,写微信首页,也就是聊天的界面,listView里的item中联系人的头像是圆角的,图形界面如下: 那么我就仔细研究了圆角的具体实 ...

  6. 自定义圆角ImageView控件

    这个就当工具类用吧,因为直接是继承的ImageView.所以也具备了ImageView所有的特点,不同的是,可以自动裁剪成圆角图片.看效果吧. 效果还是不错的.使用方式: 直接在配置中添加依赖 com ...

  7. android 圆角图片的实现形式

    android 圆角图片的实现形式,包括用第三方.也有系统的.比如makeramen:roundedimageview,系统的cardview , glide .fresco . compile 'c ...

  8. android获得ImageView图片的等级

    android获得ImageView图片的等级问题 要实现的功能如下图,点击分享能显示选中与不选中状态,然后发送是根据状态来实现具体分享功能. 在gridview中有5个子项,每个子元素都有两张图片A ...

  9. Android自定义ImageView圆形头像

    效果图: 代码如下: RoundImageView.java import cn.comnav.evaluationsystem.R; import android.content.Context; ...

随机推荐

  1. CSS之 float 属性

    特性: float的设计初衷仅仅是文字环绕效果  浮动具有破坏性,会使父容器高度塌陷  清除浮动方法: 1.脚底插入cleart:both 2.父元素BFC(IE8+)/haslayout(IE6/7 ...

  2. C++大数精度计算(带小数点)

    转: (原出处不可考,若有侵权,请联系我立即删除) 头文件: // WTNumber.h: interface for the CWTNumber class. // //////////////// ...

  3. session多服务器共享的方案

    session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点.我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? php中 ...

  4. keepalived实现nginx高可用

    keepalived是什么 keepalived直译就是保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发 ...

  5. iOS开发中使用文字图标iconfont

    在iOS的开发中,各种图标的使用是不可避免的,如果把全部图标做成图片放在项目中,那么随着项目的逐渐庞大起来,图片所占的地方就会越来越大,安装包也就随之变大了,如果图标需要根据不同的场景改变使用不同的颜 ...

  6. FastDFS 简介

    FastDFS开源的分布式文件系统,功能包括:文件存储,文件同步,文件访问(文件上传,文件下载等),解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如服务网站,视频网站等 FastD ...

  7. Python3中urllib详细使用方法(header,代理,超时,认证,异常处理) 转

    urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些 ...

  8. 有序链表--Java实现

    /*有序链表--使用的是单链表实现 *在插入的时候保持按照值顺序排列 *对于删除最小值的节点效率最高--适合频繁的删除最小的节点 * */ public class MySortedLinkList ...

  9. LeetCode 495. Teemo Attacking (提莫攻击)

    In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned ...

  10. 学习Identity Server 4的预备知识

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...