美文网首页
Android带圆角的图片

Android带圆角的图片

作者: 三季人 | 来源:发表于2016-02-29 10:22 被阅读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最终保留的依然是交集,但是显示为后绘制的,也就是我们的图片,搜噶,这样也可以。

    相关文章

      网友评论

          本文标题:Android带圆角的图片

          本文链接:https://www.haomeiwen.com/subject/focwkttx.html