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

embedded/2025/1/15 3:13:41/

XML文件

<com.example.myapplication.MyViewxmlns: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.REDprivate var mMiddleColor = Color.BLUEprivate var mEndColor = Color.GREENprivate var mDrawRect = RectF()private var mRadialGradient: RadialGradient? = nullprivate 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 = itcanvas.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
)

在这里插入图片描述


http://www.ppmy.cn/embedded/154006.html

相关文章

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…

Java-数据结构-链表(LinkedList)-双向链表

一、LinkedList(无头双向链表) 在之前的学习中&#xff0c;我们已经学习过"单向链表"并通过做题加深了对"单向链表"的认知&#xff0c;而今天我们继续来学习链表&#xff0c;也就是"无头双向链表"~ 在了解"无头双向链表"之前&#x…

STM32 : 波特率发生器

波特率发生器 1. 发送器和接收器的波特率 波特率寄存器 (BRR): 在串行通信中&#xff0c;发送器和接收器的波特率是由波特率寄存器&#xff08;BRR&#xff09;中的一个值 DIV 来确定的。 2. 计算公式 计算公式: 详细解释 1. 波特率寄存器 (BRR) BRR: 波特率寄存器是一…

CentOS安装Git

一、安装 1.执行以下命令安装&#xff1a; yum install git2.测试是否安装成功 git --version &#xff1a; [rootzhou22-jdcloud ~]# git --version git version 1.8.3.1二、生成公钥、私钥 1.配置用户名&#xff1a; git config --global user.name 用户名2.配置邮箱&am…

国产编辑器EverEdit - 一个优秀的文本编辑器该有的删除功能

1 删除功能详解 1.1 概述 本文对EverEdit的删除功能进行介绍&#xff0c;用好这些小技巧&#xff0c;对办公效率会有较大的提高。 1.2 删除功能介绍 1.2.1 普通删除 1.2.1.1 前向删除 按退格键&#xff0c;删除光标前面的字符或选中的内容。 1.2.1.2 后向删除 按Del键&am…

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…

03、MySQL安全管理和特性解析(DBA运维专用)

03、MySQL安全管理和特性解析 本节主要讲MySQL的安全管理、角色使用、特定场景下的数据库对象、各版本特性以及存储引擎 目录 03、MySQL安全管理和特性解析 1、 用户和权限管理 2、 MySQL角色管理 3、 MySQL密码管理 4、 用户资源限制 5、 忘记root密码处理办法 6、 SQ…