Shader->LinearGradient线性渐变着色器详解

devtools/2025/1/12 6:12:02/

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代码

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 mLinearGradient: LinearGradient? = 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())}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)mLinearGradient?.let {mDrawPaint.shader = itcanvas.drawRect(mDrawRect, mDrawPaint)}}
}

LinearGradient线性着色器参数详解

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

两种构造函数

java">public LinearGradient(float x0, // 起始点的x坐标float y0, // 起始点的y坐标float x1, // 结束点的x坐标float y1, // 结束点的y坐标@ColorInt int color0, // 单个起始颜色@ColorInt int color1, // 单个结束颜色@NonNull TileMode tile // 颜色映射方式) {}public LinearGradient(float x0, // 起始点的x坐标float y0, // 起始点的y坐标float x1, // 结束点的x坐标float y1, // 结束点的y坐标@NonNull @ColorLong long[] colors, // 多个起始颜色@Nullable float[] positions, // 多个结束颜色@NonNull TileMode tile // 颜色映射方式) {}

起始点(x, y)和结束点(x, y)决定颜射映射方向和映射范围

  • 如果着色器铺满整个绘制区域,区域有可能是Rect,Circle,Path,最后一个参数颜色映射方式Shader.TileMode会失效
  • 水平方向
mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.right,mDrawRect.top,mStartColor,mEndColor,Shader.TileMode.MIRROR
)

在这里插入图片描述

  • 竖直方向
mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.left,mDrawRect.bottom,mStartColor,mEndColor,Shader.TileMode.MIRROR
)

在这里插入图片描述

  • 对角线方向
mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.right,mDrawRect.bottom,mStartColor,mEndColor,Shader.TileMode.MIRROR
)

在这里插入图片描述

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

  • 起始颜色mStartColor和过渡颜色mMiddleColor只作用于[0f, 0.1f]这个区间
  • 过渡颜色mMiddleColor和结束颜色mEndColor只作用于[0.9, 1f]这个区间
  • 过渡颜色mMiddleColor只作用于[0.1f, 0.9f]这个区间
mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.right,mDrawRect.top,intArrayOf(mStartColor, mMiddleColor,mMiddleColor, mEndColor),floatArrayOf(0f, 0.1f, 0.9f, 1f), Shader.TileMode.MIRROR
)

在这里插入图片描述

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

  • 着色器绘制区域就是创建LinearGradient的时候指定的
  • Shader.TileMode.CLAMP
    • 作用:边缘填充,只有结束颜色填充绘制区域之外的部分
mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.right/2,mDrawRect.top,mStartColor, mEndColor,Shader.TileMode.CLAMP
)

在这里插入图片描述

  • Shader.TileMode.REPEAT
    • 作用:重复填充,开始颜色和结束颜色一起填充绘制区域之外的部分
        mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.right/2,mDrawRect.top,mStartColor, mEndColor,Shader.TileMode.REPEAT)

在这里插入图片描述

  • Shader.TileMode.MIRROR
    • 作用:镜像填充,开始颜色和结束颜色一起填充绘制区域之外的部分
mLinearGradient = LinearGradient(mDrawRect.left,mDrawRect.top,mDrawRect.right/2,mDrawRect.top,mStartColor, mEndColor,Shader.TileMode.MIRROR
)

在这里插入图片描述


http://www.ppmy.cn/devtools/149806.html

相关文章

鸿蒙UI(ArkUI-方舟UI框架)

参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI&#xff08;方舟UI框架&#xff09;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff…

hive在大数据体系里面起到什么作用

数据存储与管理方面 核心作用&#xff1a;Hive 是基于 Hadoop 的数据仓库工具&#xff0c;它提供了一种将结构化数据存储在分布式文件系统&#xff08;如 HDFS&#xff09;中的方式。在大数据体系中&#xff0c;数据量往往非常庞大&#xff0c;传统的数据库系统很难有效存储和管…

ip归属地和手机号是一个地址吗

IP归属地和手机号是两个常被提及但本质上截然不同的概念。它们各自代表着不同的信息&#xff0c;反映了不同的技术和应用场景。本文将从定义、原理、应用场景以及两者之间的关系等方面&#xff0c;详细探讨IP归属地和手机号是否是一个地址的问题。 一、IP归属地和手机号的定义 …

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

【C++入门】详解(中)

目录 &#x1f495;1.函数的重载 &#x1f495;2.引用的定义 &#x1f495;3.引用的一些常见问题 &#x1f495;4.引用——权限的放大/缩小/平移 &#x1f495;5. 不存在的空引用 &#x1f495;6.引用作为函数参数的速度之快&#xff08;代码体现&#xff09; &#x1f4…

用JAVA实现人工智能:采用框架Spring AI Java

Spring AI 集成人工智能&#xff0c;为Java项目添加AI功能指南 本文主旨是用实际的可操作的代码&#xff0c;介绍Java怎么通过spring ai 接入大模型。 例子使用spring ai alibaba QWen千问api完成&#xff0c;你可以跑通以后换自己的实现。QWen目前有100万免费Token额度&…

将光源视角的深度贴图应用于摄像机视角的渲染

将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射&#xff08;Shadow Mapping&#xff09;技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下&#xff0c;并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …