Android 控件背景实现发光效果

主要实现的那种光晕效果:中间亮,四周逐渐变淡的。

这边有三种发光效果,先上效果图。

第一种、圆形发光体

实现代码:新建shape_light.xml,导入以下代码。使用时,直接给view设置为background。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <gradient
        android:centerColor="@color/transparent"
        android:centerX="0.5"
        android:centerY="0.5"
        android:gradientRadius="180dp"
        android:startColor="@color/yellow"
        android:type="radial" />
</shape>

第二种、矩形发光体

代码实现:通过自定义view实现。

Kotlin 复制代码
package com.fht.testproject

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View

/**
 * @author fenghaitao
 * @time 2023/11/1 16:40
 */
class RectLightView @JvmOverloads constructor(
    context: Context, attributeSet: AttributeSet, defStyleAttr: Int = 0
) : View(context, attributeSet, defStyleAttr) {
    private val paint: Paint = Paint()
    private val corner = 50f
    private val count = 200

    init {
        paint.isAntiAlias = false
        paint.style = Paint.Style.FILL
        paint.color = Color.YELLOW
    }

    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        val w = width / count
        val h = height / count
        for (i in 0..count) {
            paint.alpha = (255 / count) * i
            if (((width - 2 * (w * i)) > 0) && ((height - 2 * (h * i)) > 0)) {
                val rectF = RectF().apply {
                    left = (w * i).toFloat()
                    top = (h * i).toFloat()
                    right = (width - w * i).toFloat()
                    bottom = (height - h * i).toFloat()
                }
                canvas?.drawRoundRect(rectF, corner, corner, paint)
            }
        }
    }
}

第三种、矩形发光体,比上一种更透明

这种有点瑕疵,中间有一点空白,不过稍微修改一下代码也可以去掉,这里就不做修改了。

代码实现:通过自定义view实现。

Kotlin 复制代码
package com.fht.testproject

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View

/**
 * @author fenghaitao
 * @time 2023/11/1 16:40
 */
class LightView @JvmOverloads constructor(
    context: Context, attributeSet: AttributeSet, defStyleAttr: Int = 0
) : View(context, attributeSet, defStyleAttr) {
    private val paint: Paint = Paint()
    private val corner = 1f
    private val count = 100

    init {
        paint.isAntiAlias = false
        paint.style = Paint.Style.STROKE
        paint.color = Color.YELLOW
    }

    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        val w = width / count
        val h = height / count
        paint.strokeWidth = w.toFloat()
        for (i in 0..count) {
            paint.alpha = (255 / count) * i
            if (((width - 2 * (w * i)) > 0) && ((height - 2 * (w * i)) > 0)) {
                val rectF = RectF().apply {
                    left = (w * i).toFloat()
                    top = (w * i).toFloat()
                    right = (width - w * i).toFloat()
                    bottom = (height - w * i).toFloat()
                }
                canvas?.drawRect(rectF, paint)
            }
        }
    }
}
相关推荐
优雅的潮叭4 小时前
cud编程之 reduce
android·redis·缓存
2601_949613024 小时前
flutter_for_openharmony家庭药箱管理app实战+用药知识详情实现
android·javascript·flutter
一起养小猫4 小时前
Flutter for OpenHarmony 实战 表单处理与验证完整指南
android·开发语言·前端·javascript·flutter·harmonyos
2601_949975084 小时前
flutter_for_openharmony城市井盖地图app实战+附近井盖实现
android·flutter
倾云鹤4 小时前
通用Digest认证
android·digest
我是阿亮啊5 小时前
Android 自定义 View 完全指南
android·自定义·自定义view·viewgroup
2601_949833397 小时前
flutter_for_openharmony口腔护理app实战+意见反馈实现
android·javascript·flutter
峥嵘life7 小时前
Android 16 EDLA测试STS模块
android·大数据·linux·学习
TheNextByte17 小时前
如何打印Android手机联系人?
android·智能手机
泡泡以安8 小时前
Android 逆向实战:从零突破某电商 App 登录接口全参数加密
android·爬虫·安卓逆向