Android带圆角的图片

2016-02-29  本文已影响178人  三季人

原文转载
http://blog.csdn.net/lmj623565791/article/details/24555655

核心代码分析:
/** 
 * 根据原图和变长绘制圆形图片 
 *  
 * @param source 
 * @param min 
 * @return 
 */  
private Bitmap createCircleImage(Bitmap source, int min)  
{  
    final Paint paint = new Paint();  
    paint.setAntiAlias(true);  
    Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);  
    /** 
     * 产生一个同样大小的画布 
     */  
    Canvas canvas = new Canvas(target);  
    /** 
     * 首先绘制圆形 
     */  
    canvas.drawCircle(min / 2, min / 2, min / 2, paint);  
    /** 
     * 使用SRC_IN 
     */  
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  
    /** 
     * 绘制图片 
     */  
    canvas.drawBitmap(source, 0, 0, paint);  
    return target;  
} 

其实主要靠:
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));这行代码,为什么呢,我给大家解释下,SRC_IN这种模式,两个绘制的效果叠加后取交集展现后图,怎么说呢,咱们第一个绘制的是个圆形,第二个绘制的是个Bitmap,于是交集为圆形,展现的是BItmap,就实现了圆形图片效果。圆角,其实就是先绘制圆角矩形,是不是很简单,以后别人再说实现圆角,你就把这一行代码给他就行了

Android 颜色渲染 PorterDuff及Xfermode详解
利用ProterBuff.Mode我们可以完成任意2D图像测操作, 比如涂鸦画板应用中的橡皮擦效果,绘制各种自定义的进度,等等很强大的效果,下面请看具体的介绍:

Xfermode有三个子类 :

**AvoidXfermode ** 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
**PixelXorXfermode **当覆盖已有的颜色时,应用一个简单的像素异或操作。
PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
要应用转换模式,可以使用setXferMode方法,如下所示:
>AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);

首先看一下效果图


20130828212947609.jpg

从上面我们可以看到PorterDuff.Mode为枚举类,一共有16个枚举值:

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
取两图层全部区域,交集部分变为透明色

问题1、如果我想实现圆形图片,怎么实现?

答:先绘制我们的图片,然后在上面绘制一个圆,最后生成的效果就是圆形图片;等等,怎么就生成了,请看上面的SrcIn这种模式;
先绘制的Dst,然后设置DstIn,然后绘制Src;最后效果是留下了二者交集且是Dst的部分;下面我们把我们的答案带进去。
先绘制图片,然后设置DstIn,然后绘制圆形;最后效果是留下了二者交集且是图片的部分;嗯,交集是什么,圆形;圆形内容是什么,图片;搜噶,有点感觉了。
等等,我还有有个思路,先绘制圆形,然后设置SrcIn,再绘制我们的图片;也能生成我们的圆形图片。我们来看看:
SrcIn最终保留的依然是交集,但是显示为后绘制的,也就是我们的图片,搜噶,这样也可以。
上一篇 下一篇

猜你喜欢

热点阅读