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

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

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 mLinearGradient: LinearGradient? = 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())
    }

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

LinearGradient线性着色器参数详解

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

两种构造函数

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
)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【芯片封测学习专栏 -- 单 Die 与 多Die(Chiplet)介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview单个Die&#xff08;Monolithic Die&#xff09;多个Die&#xff08;Chiplet Architecture or Heterogeneous SoC&#xff09;如何判断一个SoC是…

acwing_5722_十滴水

acwing_5722_十滴水 下面这篇大佬的题解属实是把指针用明白了&#xff0c;可以好好理解一下&#xff1a; 原题解连接&#xff1a;AcWing 5722. 一个简单模拟实现 - AcWing map/unordered_map的用法:见收藏夹 #include<iostream> #include<unordered_map> #incl…

零基础学AI大模型要多久?真的能学会吗?

很多人都对学习AI大模型抱有疑问&#xff0c;特别是那些完全没有编程基础的朋友。其实&#xff0c;从零开始学习AI大模型是可以做到的&#xff0c;关键在于你的学习方法和投入的时间。下面我们来详细聊一聊这个问题。 学习时间 自学&#xff1a; 如果你选择自学&#xff0c;…

攻防靶场(34):隐蔽的计划任务提权 Funbox1

目录 1. 侦查 1.1 收集目标网络信息&#xff1a;IP地址 1.2 主动扫描&#xff1a;扫描IP地址段 1.3 搜索目标网站 2. 初始访问 2.1 有效账户&#xff1a;默认账户 2.2 利用面向公众的应用 2.3 有效账户&#xff1a;默认账户 3. 权限提升 3.1 计划任务/作业&#xff1a;Cron 靶场…

Java高频面试之SE-11

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中是引用传递还是值传递&#xff1f; 在 Java 中&#xff0c;方法参数传递是通过 值传递 的方式实现的&#xff0c;但这可能会引起一…

2.两数相加--力扣

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

与Linux的设备树文件(dts)的基础知识【编写和操作】

编写相关 01-双引号中的内容表示字符串,<>中的内容表示数值 示例如下&#xff1a; / {swh_led0 {compatible "swh_leddrv";pin <0x00030001>;};.......};compatible的具体内容为字符串swh_leddrv&#xff0c;而pin的值为数值0x00030001。 操作相关…

STM32第6章、WWDG

一、简介 WWDG&#xff1a;全称Window watchdog&#xff0c;即窗口看门狗&#xff0c;本质上是一个能产生系统复位信号和提前唤醒中断的计数器。 特性&#xff1a; 是一个递减计数器。 看门狗被激活后&#xff0c; 当递减计数器值从 0x40减到0x3F时会产生复位&#xff08;即T6位…

国产fpga nvme ip高速存储方案设计

国产高速存储方案主要是使用nvme ip实现高速存储方案&#xff0c;nvme ip采用纯verilog语言实现&#xff0c;用户拿到nvme ip使用起来也很简单。 先看看效果如 zu7eg板子&#xff0c;这个芯片支持pcie3.0 x4. zynq 7045板子只支持pcie 2.0 x4 速度测试&#xff0c;测试nvme …

《框架程序设计》复习题解析-1

目录 单选题 1.以下关于Maven说法错误的是&#xff1f;&#xff08; &#xff09;。 2.在项目的开发过程中&#xff0c;MyBatis承担的责任是( ) 3.当项目引用依赖的范围设置为以下&#xff08; &#xff09;选项时&#xff0c;表示依赖在编译时是必需的&#xff0c;但在运…

STM32F103的ADC通道映射

ADC通道映射 STM32F103带3个ADC控制器&#xff0c;一共支持23个通道&#xff0c;包括21个外部和2个内部信号源。ADC1控制器最多有18个通道&#xff0c;包括16个外部和2个内部信号源。 ADC1和ADC2的16个外部通道相同&#xff0c;且ADC1和ADC2共用一个系统中断向量&#xff0c;A…

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数&#xff1a; 实现思路&#xff1a; 核心代码&#xff1a; 完整代码&#xff1a; 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物&#xff08;Overlay&#xf…

[Transformer] The Structure of GPT, Generative Pretrained Transformer

The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work

【芯片封测学习专栏 -- Substrate | RDL Interposer | Si Interposer | 嵌入式硅桥(EMIB)详细介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewSubstrate&#xff08;衬底或基板&#xff09;Substrate 定义Substrate 特点与作用Substrate 实例 RDL Interposer&#xff08;重布线层中介层&a…

基于单片机的无线气象仪系统设计(论文+源码)

1系统方案设计 如图2.1所示为无线气象仪系统设计框架。系统设计采用STM32单片机作为主控制器&#xff0c;结合DHT11温湿度传感器、光敏传感器、BMP180气压传感器、PR-3000-FS-N01风速传感器实现气象环境的温度、湿度、光照、气压、风速等环境数据的检测&#xff0c;并通过OLED1…

【JavaWeb】JavaWeb入门之Tomcat详解

目录 1.Java Web前奏 1.1.C/S结构 1.2.B/S结构 1.3.静态网页和动态网页 1.4.常见的网页 1.5.Web服务器 2.HTTP协议 2.1.HTTP协议概念 2.2.无状态协议 2.3.HTTP1.0和HTTP1.1 2.4.请求协议和响应协议 2.5.请求协议 2.5.1.GET请求 2.5.2.POST请求 2.6.响应协议 1.J…

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时&#xff0c;我们常常会使用 Autowired 来装配。但是&#xff0c;有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同&#xff0c;使用 Autowired 一般都不会设置属性值&#xff0c;而 Value 必须指定一个字符串值&#xff0c;因为其…

nginx反向代理和负载均衡的区别

1、反向代理&#xff0c;不需要服务器池&#xff0c;直接代理某台服务器 location / {proxy_pass http://192.168.18.201;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr; }proxy_set_header Host $host; …

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

二叉搜索树中的插入操作 https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树返回插入后二叉搜索树的根节点。 输入数据 保…