Android实战自定义View

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

2018-04-19  本文已影响1010人  zhaoyubetter

参考

  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) 

参数:

模糊半径:
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实现发光效果

SetMaskFilter之BlurMaskFilter

Paint的setMaskFilter函数:

public MaskFilter setMaskFilter(MaskFilter maskfilter)

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

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

public BlurMaskFilter(float radius, Blur style) 

示例代码:

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)
}
效果图

bitmap添加阴影

上一篇 下一篇

猜你喜欢

热点阅读