自定义控件绘制(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添加阴影

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容