本篇文章主要介绍了"android-自定义ImageView-圆形图片绘制代码详解",主要涉及到gravity,博客,Canvas,Activity方面的内容,对于Android开发感兴趣的同学可以参考一下:
andorid中圆形图片很早就有啦,今天算是搞了一把,自己写了出来,并且可以实际使用的代码。
先看效果图: 图片的原图是: 先看看xml的布局文件是怎么样的:...
andorid中圆形图片很早就有啦,今天算是搞了一把,自己写了出来,并且可以实际使用的代码。
先看效果图:

图片的原图是:

先看看xml的布局文件是怎么样的:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingLeft="@dimen/Activity_horizontal_margin"android:paddingRight="@dimen/Activity_horizontal_margin"android:paddingTop="@dimen/Activity_vertical_margin"android:paddingBottom="@dimen/Activity_vertical_margin"tools:context=".MainActivity"><com.husy.surfaceviewexample.PorterDuffViewImage
android:layout_width="60dp"android:layout_height="60dp"android:src="@mipmap/zly"android:visibility="visible"
/>LinearLayout>
布局文件很简单,只要是ImageView的属性都可以在自定义的圆形图片组件中使用。
由于布局文件中规定了图片大小60dp,所以你看到效果图中,相对于原图来说,是由缩放效果的,但是整体的图片是居中进行缩放显示。
好了,说到这里,首先补充一些基础知识。
代码中使用到了PorterDuffXfermode 类:
PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
该类的用法如下:
//创建PorterDuffXfermode
PorterDuffXfermode mode=new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
//设置mode画笔风格
paintnew.setXfermode(mode);
这样设置画笔,到底什么效果,看看Google的效果图:

1.PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC
显示上层绘制图片
3.PorterDuff.Mode.DST
显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT
取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR
异或:去除两图层交集部分
13.PorterDuff.Mode.DARKEN
取两图层全部区域,交集部分颜色加深
14.PorterDuff.Mode.LIGHTEN
取两图层全部,点亮交集部分颜色
15.PorterDuff.Mode.MULTIPLY
取两图层交集部分叠加后颜色
16.PorterDuff.Mode.SCREEN
取两图层全部区域,交集部分变为透明色
(以上内容参考我的博友的文章内容:原文链接请猛戳这里是个妹子呦~~~哈哈)
看了上面的内容,我觉得对于刚开始接触这个类的同学来说,太过抽象啦。
下面我给解释一下,希望能达到解惑的目的吧。
首先看上面的16副图中的第二幅和第三幅图,里面都是一幅图片,Src代表原图,是一个正方形,Dst代表目的图,是一个圆形。
下面接着看第四幅图,SrcOver模式,你会发现正方形放在了圆形的上面,并且正方形显示完全,圆形被正方形覆盖了一部分。这就是SrcOver模式的效果。
下面再看第五幅图,PorterDuff.Mode.DST_OVER,你会发现圆形放在了正方形的上面,圆形显示完全,正方形被覆盖了,这就是这种模式达到的效果。
我们看了这几幅图之后,就可以做一个总结啦。
也就是说上面的PorterDuffXfermode 类完成的效果,应该是两幅图或者说两个位图完成的效果。
这个时候,你在看下面的11中模式,会发现都是在两幅图或者两幅位图的基础上进行显示的效果。
下面我们就有了画圆形图头像的思路了。
利用的就是上面的PorterDuff.Mode.SRC_IN或者是PorterDuff.Mode.DST_IN这两种模式达到的效果。
首先说说PorterDuff.Mode.SRC_IN这种模式的思路:

这种效果如上图。正方形在圆形图上面的部分显示出来,正方形的其他部分不显示。并且圆形图也不显示。
我们可以把正方形的部分设置我们要显示的头像图片,把圆形部分设置为我们的圆形的位图,并且这两个图都居中显示,这样达到的效果就是圆形头像图片的效果!!
再说说PorterDuff.Mode.DST_IN这种模式的思路:

这种效果图上,正方形部分不显示,只显示圆形图在正方形重合的部分,圆形图的其他部分不显示。
这个模式下,我们把圆形图设置为我们想要显示的头像图片,把正方形设置为圆形的位图,并且这两个图都居中显示,这样达到的效果就是圆形头像的效果。
对比上面两种模式下的思路,会发现我们只是把图片调换了以下就可以啦。
好了,下面给出两种模式下的代码,首先给出PorterDuff.Mode.SRC_IN模式下的代码: