Shader -> RadialGradient圆心渐变着色器详解

XML文件

xml 复制代码
<com.example.myapplication.MyView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_gravity="center"
    android:layout_height="400dp"/>

自定义View代码

kotlin 复制代码
class MyView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    private var mStartColor = Color.RED
    private var mMiddleColor = Color.BLUE
    private var mEndColor = Color.GREEN

    private var mDrawRect = RectF()
    private var mRadialGradient: RadialGradient? = null
    private var mDrawPaint = Paint()

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        mDrawRect = RectF(0f, 0f, w.toFloat(), h.toFloat())
        mRadialGradient = RadialGradient(
            mDrawRect.centerX(),
            mDrawRect.centerY(),
            min(mDrawRect.width(), mDrawRect.height()) / 4,
            intArrayOf(mStartColor, mMiddleColor, mMiddleColor, mEndColor),
            floatArrayOf(0f, 0.3f, 0.7f, 1f),
            Shader.TileMode.CLAMP
        )
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        mRadialGradient?.let {
            mDrawPaint.shader = it
            canvas.drawRect(mDrawRect, mDrawPaint)
        }
    }
}

RadialGradient线性着色器参数详解

  • RadialGradient线性着色器赋值给Paint画笔,可以使用Canvas画布和Paint画笔绘制具有圆心渐变的内容

两种构造函数

  • 构造函数 1:简单单色渐变
kotlin 复制代码
public RadialGradient(float centerX, // 渐变中心的 x 坐标
                      float centerY, // 渐变中心的 y 坐标
                      float radius,  // 渐变的半径
                      @ColorInt int centerColor, // 中心颜色
                      @ColorInt int edgeColor,   // 边缘颜色
                      @NonNull TileMode tileMode // 颜色映射方式) {}
  • centerX, centerY: 渐变中心的坐标
  • radius: 渐变的半径,定义渐变从中心到边缘的距离
  • centerColor: 中心颜色,定义渐变开始时的颜色
  • edgeColor: 边缘颜色,定义渐变结束时的颜色
  • tileMode: 颜色映射模式,用于定义渐变在超出半径范围时的行为
    • TileMode.CLAMP: 使用边界颜色填充
    • TileMode.REPEAT: 重复渐变图案
    • TileMode.MIRROR: 镜像重复渐变图案
  • 构造函数 2:复杂多色渐变
kotlin 复制代码
public RadialGradient(float centerX, // 渐变中心的 x 坐标
                      float centerY, // 渐变中心的 y 坐标
                      float radius,  // 渐变的半径
                      @NonNull @ColorLong long[] colors, // 渐变颜色数组
                      @Nullable float[] stops, // 颜色位置数组
                      @NonNull TileMode tileMode // 颜色映射方式) {}
  • centerX, centerY: 渐变中心的坐标。
  • radius: 渐变的半径,定义渐变从中心到边缘的距离。
  • colors: 定义渐变的颜色数组,至少需要两个颜色。
  • stops: 可选的颜色位置数组,定义每个对应颜色的相对位置(0 到 1 之间的浮点数)。如果为 null,颜色将在渐变中均匀分布。
  • tileMode: 颜色映射模式,用于定义渐变在超出半径范围时的行为
    • TileMode.CLAMP: 使用边界颜色填充
    • TileMode.REPEAT: 重复渐变图案
    • TileMode.MIRROR: 镜像重复渐变图案

渐变中心点(x, y)只决定圆心位置,映射方向永远是圆心向各个角度映射

颜色数组IntArray和位置数组FloatArray决定颜色的数量和位置

  • 起始颜色 mStartColor 和过渡颜色 mMiddleColor 只作用于 [0f, 0.3f] 这个区间
  • 过渡颜色 mMiddleColor 和结束颜色 mEndColor 只作用于 [0.7f, 1f] 这个区间
  • 过渡颜色 mMiddleColor 只作用于 [0.3f, 0.7f] 这个区间
kotlin 复制代码
mRadialGradient = RadialGradient(
    mDrawRect.centerX(),
    mDrawRect.centerY(),
    min(mDrawRect.width(), mDrawRect.height()) / 4,
    intArrayOf(mStartColor, mMiddleColor, mMiddleColor, mEndColor),
    floatArrayOf(0f, 0.3f, 0.7f, 1f),
    Shader.TileMode.CLAMP
)

映射方式Shader.TileMode决定着色器绘制区域之外的部分如何绘制

  • 着色器绘制区域就是创建RadialGradient的时候指定的
  • Shader.TileMode.CLAMP
    • 作用:边缘填充,只有结束颜色填充绘制区域之外的部分
kotlin 复制代码
mRadialGradient = RadialGradient(
    mDrawRect.centerX(),
    mDrawRect.centerY(),
    min(mDrawRect.width(), mDrawRect.height()) / 4,
    intArrayOf(mStartColor, mMiddleColor, mMiddleColor, mEndColor),
    floatArrayOf(0f, 0.3f, 0.7f, 1f),
    Shader.TileMode.CLAMP
)
  • Shader.TileMode.REPEAT
    • 作用:重复填充,开始颜色和结束颜色一起填充绘制区域之外的部分
kotlin 复制代码
mRadialGradient = RadialGradient(
    mDrawRect.centerX(),
    mDrawRect.centerY(),
    min(mDrawRect.width(), mDrawRect.height()) / 4,
    intArrayOf(mStartColor, mMiddleColor, mMiddleColor, mEndColor),
    floatArrayOf(0f, 0.3f, 0.7f, 1f),
    Shader.TileMode.REPEAT
)
  • Shader.TileMode.MIRROR
    • 作用:镜像填充,开始颜色和结束颜色一起填充绘制区域之外的部分
kotlin 复制代码
mLinearGradient = LinearGradient(
    mDrawRect.left,
    mDrawRect.top,
    mDrawRect.right/2,
    mDrawRect.top,
    mStartColor, mEndColor,
    Shader.TileMode.MIRROR
)
相关推荐
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
驰骋工作流8 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
zzu123zsw9 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号10 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
传奇开心果编程10 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
论文复现现场10 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠10 小时前
泛微OAe9-后端二开异步调用
java
我是唐青枫10 小时前
Kotlin Delegation 委托详解
开发语言·kotlin
秋天的怀念_David11 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放11 小时前
Python基础语法练习题(73)
java·前端·python