美文网首页Android实战自定义View
自定义控件绘制(Paint之阴影发光效果)篇十

自定义控件绘制(Paint之阴影发光效果)篇十

作者: zhaoyubetter | 来源:发表于2018-04-19 23:04 被阅读1010次

    参考

    1. https://blog.csdn.net/harvic880925/article/details/51818489
    2. https://blog.csdn.net/harvic880925/article/details/51615221

    昨天看了一些博主的QQ仿红点拖动效果。写的相当不错,最好自己去实践一下;原理其实比较简单,也就是组合各种基础技术,形成效果,不得不说,基础知识是多么重要;
    路必须一步一步走;

    Paint.setShadowLayer阴影效果

    Paint中有一个专门用来实现阴影效果的函数setShadowLayer

    public void setShadowLayer(float radius, float dx, float dy, int shadowColor) 
    

    参数:

    • radius:模糊半径,radius越大越模糊,越小越清晰,但是如果radius设置为0,则阴影消失不见;
    • dx:阴影的横向偏移距离,正值向右偏移,负值向左偏移;
    • dy:阴影的纵向偏移距离,正值向下偏移,负值向上偏移;
    • color:绘制阴影的画笔颜色,即阴影的颜色(对图片阴影无效);

    模糊半径:
    setShadowLayer使用的是高斯模糊算法,高斯模糊的具体算法是:对于正在处理的每一个像素,取周围若干个像素的RGB值并且平均,然后这个平均值就是模糊处理过的像素;
    取周围像素的半径就是模糊半径,模糊半径越大,所得平均像素与原始像素相差就越大,也就越模糊;

    注意:setShadowLayer 不支持硬件加速;

    val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        strokeWidth = 2f
        color = Color.GREEN
    }
    val bmp = BitmapFactory.decodeResource(resources, R.mipmap.juntuan)
    init {
        // 需禁用硬件加速
        setLayerType(LAYER_TYPE_SOFTWARE, null)
    }
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        paint.apply {
            setShadowLayer(10f, 50f, 50f, Color.GREEN)
        }
        canvas.drawBitmap(bmp, 100f, 100f, paint)
    }
    
    效果图

    Paint. clearShadowLayer清除阴影

    TextView 阴影效果

    直接调用 setShadowLayer() 方法进行设置;也可以在xml中进行设置;

    root_container.addView(TextView(this@PaintShadowLayerActivity).apply {
                    setShadowLayer(10f, 10f, 10f, Color.GRAY)
                    textColor = Color.BLACK
                    text = "非常感谢启舰提供这么好的教程"
                    textSize = 20f
    })
    
    <TextView
        android:shadowRadius="3"  
        android:shadowDx="5"  
        android:shadowDy="5"  
        android:shadowColor="@android:color/darker_gray">
    
    阴影文字效果

    SetMaskFilter之BlurMaskFilter实现发光效果

    • 与setShadowLayer一样,发光效果也是使用的高斯模糊,并且只会影响边缘部分图像,内部图像是不受影响的;
    • 发光效果是无法指定发光颜色的,采用边缘部分的颜色取样来进行模糊发光。所以边缘是什么颜色,发出的光也就是什么颜色的。

    SetMaskFilter之BlurMaskFilter

    Paint的setMaskFilter函数:

    public MaskFilter setMaskFilter(MaskFilter maskfilter)
    

    与setColorFilter颜色滤镜类似,setMaskFilter中的MaskFilter也是没有具体实现的,也是通过派生子类来实现具体的不同功能的,其有2个子类:

    • BlurMaskFilter 实现发光效果
    • EmbossMaskFilter 实现浮雕效果

    maskFilter也是不支持硬件加速的,BlurMaskFilter 的构造如下:

    public BlurMaskFilter(float radius, Blur style) 
    
    • radius: 模糊半径;
    • style:发光样式;
      • Blur.INNER 内发光;
      • Blur.SOLID 外发光;
      • Blur.NORMAL 内外发光;
      • Blur.OUTER 仅发光部分可见;

    示例代码:

    val paint = Paint().apply {
        color = Color.RED
        maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.INNER)
    }
    val bmp = BitmapFactory.decodeResource(resources, R.mipmap.juntuan)
    
    init {
        // 需禁用硬件加速
        setLayerType(LAYER_TYPE_SOFTWARE, null)
    }
    
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawCircle(200f, 200f, 100f, paint)
    
        canvas.translate(350f, 0f)
        paint.maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.SOLID)
        canvas.drawCircle(200f, 200f, 100f, paint)
    
        canvas.translate(-350f, 350f)
        paint.maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.NORMAL)
        canvas.drawCircle(200f, 200f, 100f, paint)
    
        canvas.translate(350f, 0f)
        paint.maskFilter = BlurMaskFilter(100f, BlurMaskFilter.Blur.OUTER)
        canvas.drawCircle(200f, 200f, 100f, paint)
    
        canvas.translate(-350f, 350f)
        paint.maskFilter = BlurMaskFilter(50f, BlurMaskFilter.Blur.SOLID)
        canvas.drawBitmap(bmp, 200f,200f, paint)
    }
    
    效果图
    • 上左:内发光(INNER)
    • 上右:外发光(SOLID)
    • 下左:内外发光(NORMAL)
    • 下右:仅显示发光效果(OUTER),该模式下仅会显示发光效果,会把原图像中除了发光部分,全部变为透明;

    bitmap添加阴影

    相关文章

      网友评论

        本文标题:自定义控件绘制(Paint之阴影发光效果)篇十

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