Android实现图片圆角的两种方式

概要

本片文章主要介绍实现图片圆角的两种方式,一种是采用PorterDuffXfermode图层合并的方式,另一种就是使用BitmapShader来实现圆角。比较推荐的一种方式当然是第二种方式了,事实上github上一些大神级别的人物多数也采用的第二种方式,而且理由看上去也很高达上。

github_cicleimageView

因为开发中经常用到圆角图片,虽说用到的地方不多,但是应用中都会多少用到圆角图片,基本上是一些个人头像展示时用,如果不是图片而是仅仅实现圆角功能,Android系统本身就提供了该功能,采用系统Shape自定义图形效果。

android_shape

废话少说,一图顶千言,先上效果图展示一下最终的效果。

circleImageView

PorterDuffXfermode方式

有关Bitmap位图PorterDuffXfermode方式更多信息可以参考上一篇文章Bitmap学习笔记,虽然该种方式目前来说并不是最佳的推荐实现方式,但是至少可以多拓宽一下Bitmap相关方面的视野,如果从事web开发的人员,当然了熟悉css开发的应该很清楚,如果我们现在在最新版本的浏览器中实现圆角,那是相当简单的一件事情,border-radius:3px;,一条css属性即可搞定。但是像Android这种如果开发一个app,则多少需要费些心思。

先来看一些自定义属性吧

上面这些属性不用做过多的解释了,本片文章只讨论实现正圆方式的图片,如果不实现正圆则只需要更改部分代码即可。

自定义属性获取

将Drawable对象转换为Bitmap对象

部分对象初始化及半径计算

onDraw方法

BitmapShader方式

BitmapShader位图着色器,采用该方法实现图片圆角处理比起第一种方式就简单多了,最常用的就是BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY),简单说明一下TileMode这个参数,有三个取值:

  • REPEAT重复:就是横向、纵向不断重复这个bitmap;
  • MIRROR镜像:横向不断翻转重复,纵向不断翻转重复;
  • CLAMP拉伸:这个和电脑屏保的模式应该有些不同,这个拉伸的是图片最后的那一个像素;横向的最后一个横行像素,不断的重复,纵项的那一列像素,不断的重复;

简单说一下,这里所讲的这三个属性跟Matrix中属性是不同的,MIRROR镜像实际上是在我们平铺图片时采用的方式,与Matrix中我们将的图片镜像并不是一码事,下面一张图展示了BitmapShader中MIRROR镜像

shader_mirror

init初始化方法

部分变量赋值

onDraw方法

本文地址www.sunnyang.com/288.html

源代码下载

参考资料

关于 android ImageView 圆角处理 圆图

自定义控件其实很简单1/3

发表评论