• 一起Talk Android吧(第四百二十三回:给图片添加阴影)



    各位看官们,大家好,上一回中咱们说的例子是"绘图中添加发光效果",这一回咱们介绍的例子是" 给图片添加阴影"。闲话休提,言归正转,让我们一起Talk Android吧!

    看官们,我们在前面章回中介绍了在绘图中添加阴影的内容,不过有一个例外:图片上添加阴影后无效果。不过可以给图片添加发光效果,发光效果可以让图片在它周围产生模糊的效果,本章回中将利用发光效果来给图片添加阴影。

    整体思路

    利用发光效果来给图片添加阴影,首先在图片上添加发光效果,然后绘制此图片。图片周围会产生模糊的效果,类似阴影,不过这个不能准确地叫阴影,因为它在图片的四个方向上都有模糊效果。那么我们在带发光效果的图片上再覆盖一张原来的图片,只是把坐标向左和上两个方向做了偏移,这样使的带发光效果的图片位于原图的右下方,这样就出现阴影的效果。

    不过与其它非图片的阴影效果相比,这种方法实现的阴影效果还是差一些。如果图片是纯色的阴影效果还可以,如果图片是混合颜色或者风景画,那么其阴影效果非常不好。既然纯色效果好,我们就在所有图片上都画一个纯色的阴影。

    具体的思路:先画一个纯色的图片,具体使用什么颜色依据项目来决定,我的经验是选择原图边缘的颜色,不过图片的大小要和原图保持一致,然后画出原图,画原图时原图的坐标要和纯色图片的坐标有偏移。

    具体步骤

    • 1.画一个纯色的图片,图片大小和原图保持一致;
    • 2.给画笔设定颜色和发光效果;
    • 3.画出带发光效果的图片;
    • 4.画出原图,注意给原图的坐标做偏移;

    这个过程中最关键的步骤是第一步,这里利用了extractAlpha()方法来获取一个和原图大小一样同时只包含透明度的图片,此图片中只有透明度,画这种图片时图片的颜色与画笔的颜色相同,指定画笔的颜色就间接地指定了图片的颜色。

    示例代码

        private void drawShadow4Image(Canvas canvas) {
    
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.img1);
            //获取和原图大小保持一致只包含透明度的图片;
            Bitmap alphaBitmap = bitmap.extractAlpha();
            mTextPaint.setColor(Color.GREEN);
            mTextPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));
    
            //直接画带有发光效果的原图,阴影效果不太好
    //        canvas.drawBitmap(bitmap,220,820,mTextPaint);
            //画带有发光效果的纯色图片,阴影效果好
            canvas.drawBitmap(alphaBitmap,210,810,mTextPaint);
    
            mTextPaint.setMaskFilter(null);
            canvas.drawBitmap(bitmap,200,800,mTextPaint);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上面的代码中我们使用绿色来画图片的阴影,是因为图片边缘是绿色。此外,代码中的坐标是写死的,大家可以自己灵活控制。

    还一个地方需要注意:画完纯色发光效果的图片后需要清除画笔中的发光效果,或者说使用另外一种画笔画原图,不然使用相同画笔画原图时,原图中会带上发光效果。

    我在这里就不演示程序的运行效果了,建议大家自己动手去实践。

    看官们,关于Android中"给图片添加阴影"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

  • 相关阅读:
    linux内核的文件组织形式
    GGTalk 开源即时通讯系统源码剖析之:虚拟数据库
    k-means clustering algorithm,K均值算法
    AVR单片机开发2——流水灯及仿真
    关于ROS的网络通讯方式TCP/UDP
    24、DAPlink仿真器-STM32F103C8T6
    C语言入门Day_18 判断和循坏的小结
    据安全的重要性:如何解密[thekeyishere@cock.li].Elbie勒索病毒
    Spark 中 Aggregate 的实现
    Selenium基础 — Selenium元素定位(一)
  • 原文地址:https://blog.csdn.net/talk_8/article/details/128010722