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

参考

  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添加阴影

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容