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

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 mSweepGradient: SweepGradient? = 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())
        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 = it
            canvas.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对象传入
相关推荐
郑州光合科技余经理4 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071574 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat4 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源4 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog4 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
HEJOO95 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl5 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
EatFan5 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长5 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
sunshine22 girl6 小时前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习