Shader -> SweepGradient扫描渐变着色器详解

server/2025/1/16 1:35:12/

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 mSweepGradient: SweepGradient? = 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())mSweepGradient = SweepGradient(mDrawRect.centerX(), // 渐变中心的 x 坐标,设置为矩形中心的 x 坐标mDrawRect.centerY(), // 渐变中心的 y 坐标,设置为矩形中心的 y 坐标intArrayOf(mStartColor, mMiddleColor, mEndColor), // 渐变颜色数组floatArrayOf(0f, 0.5f, 1f) // 颜色位置数组)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)mSweepGradient?.let {mDrawPaint.shader = itcanvas.drawRect(mDrawRect, mDrawPaint)}}
}

RadialGradient线性着色器参数详解

  • RadialGradient扫描渐变着色器赋值给Paint画笔,可以使用Canvas画布和Paint画笔绘制具有扫描渐变的内容,从渐变中心点开始顺时针旋转,进行扫描渐变

构造函数

  • 构造函数:多色渐变
java">public SweepGradient(float cx, // 渐变中心的 x 坐标float cy, // 渐变中心的 y 坐标@NonNull int[] colors, // 渐变颜色数组@Nullable float[] positions) // 颜色位置数组
  • cx, cy: 渐变中心的坐标
  • colors: 定义渐变的颜色数组,至少需要两个颜色
  • positions: 可选的颜色位置数组,定义每个对应颜色的相对位置(0 到 1 之间的浮点数)。如果为 null,颜色将在渐变中均匀分布

渐变中心点(x, y)只决定中心位置,映射方向按照顺时针旋转扫描绘制

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

  • 起始颜色 mStartColor 和过渡颜色 mMiddleColor 只作用于 [0f, 0.5f] 这个区间
  • 过渡颜色 mMiddleColor 和结束颜色 mEndColor 只作用于 [0.5f, 1f] 这个区间
kotlin">mSweepGradient = SweepGradient(mDrawRect.centerX(), // 渐变中心的 x 坐标,设置为矩形中心的 x 坐标mDrawRect.centerY(), // 渐变中心的 y 坐标,设置为矩形中心的 y 坐标intArrayOf(mStartColor, mMiddleColor, mEndColor), // 渐变颜色数组floatArrayOf(0f, 0.5f, 1f) // 颜色位置数组
)

在这里插入图片描述

SweepGradient没有映射方式

  • SweepGradient 没有 TileMode着色器映射方式,用于创建完整的圆周渐变,没有边缘、重复、镜像的颜色去绘制着色器区域之外的渐变,绘制起始点和结束点都是同一个,为创建SweepGradient对象传入

http://www.ppmy.cn/server/158094.html

相关文章

Qt天气预报系统实现HTTP请求

Qt天气预报系统实现HTTP请求 1、添加网请求络模块2、声明一个网络请求对象3、实例化一个网络请求对象4、连接网络请求获取的信号与槽5、新建一个网络请求获取的槽函数6、定义一个获取天气数据的函数7、在构造中&#xff0c;请求天气数据8、请求天气数据9、网络请求获取10 .h文件…

详解数据增强中的平移shft操作

Shift 平移是指在数据增强&#xff08;data augmentation&#xff09;过程中&#xff0c;通过对输入图像或目标进行位置偏移&#xff08;平移&#xff09;&#xff0c;让目标在图像中呈现出不同的位置。Shift 平移的目的是增加训练数据的多样性&#xff0c;从而提高模型对目标在…

VSCode配置php开发环境

我偷偷地告诉你&#xff0c; 有一个地方叫做稻城&#xff0c;我要和我最心爱的人一起去到那里... 2025.1.10 声明 仅作为个人学习使用&#xff0c;仅供参考 不知道如何配置php本地环境的&#xff0c;请翻阅 笔者的上一篇文章 正文 VSCode安装 官网&#xff1a;Download Vis…

Python学习(三)基础入门(数据类型、变量、条件判断、模式匹配、循环)

目录 一、第一个 Python 程序1.1 命令行模式、Python 交互模式1.2 Python的执行方式1.3 SyntaxError 语法错误1.4 输入和输出 二、Python 基础2.1 Python 语法2.2 数据类型1&#xff09;Number 数字2&#xff09;String 字符串3&#xff09;List 列表4&#xff09;Tuple 元组5&…

uniapp页面高度设置(铺满可视区域、顶部状态栏高度、底部导航栏高度)

这里说几种在uniapp开发中,关于页面设置高度的几种情况。宽度就不说了哈,宽度设置百分比都会生效。 首先我们要知道平时开发中,如果说没在uniapp做特殊处理,即正常情况下,所有的页面(.vue文件)中都是没有高度的(和vue一样),也就是说给最外层的的view标签设置高度为1…

Vue 中,使用 v-for 和 v-if 在同一个元素上时,出现报错,怎么解决

直接上报错图&#xff1a; 上图所示&#xff0c;其实就是 因为 v-for 的优先级比 v-if 高&#xff0c;Vue 会先尝试遍历 v-for 里面&#xff0c;然后再检查 v-if 的条件&#xff0c;这可能会导致意外的行为或错误。 解决办法有两种&#xff1a; 1.常见办法&#xff0c;也就是…

利用ArcGIS快速准确地统计出地块的现状容积率

研究目的 根据建筑.dwg、建筑.dwg Annotation、建筑.dwg Polygon&#xff0c;地籍边界.shp等数据&#xff0c;利用GIS快速准确地统计出地块的现状容积率。 研究思路 加载数据图层&#xff1a;建筑.dwg Polygon、建筑.dwg Annotation&#xff0c;使用空间连接功能把建筑层数数…

1. 使用springboot做一个音乐播放器软件项目【前期规划】

背景&#xff1a; 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴&#xff0c;资金又比较紧张&#xff0c;是那么的不友好。作为程序员的我&#xff0c;也是喜欢听着歌&#xff0c;敲着代码。 最近就想做一个音乐播放器的软件&#xff0c;在内网中使…