参考
- https://blog.csdn.net/harvic880925/article/details/51818489
- 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),该模式下仅会显示发光效果,会把原图像中除了发光部分,全部变为透明;