自定义View之Paint
来源:互联网 发布:全聚合电视直播软件 编辑:程序博客网 时间:2024/05/19 14:15
LinearGradient
LinearGradient被称为线性渲染,其意味着着色器使用线性变化的颜色来进行渲染。以做到这样的效果:
LinearGradient有两个构造函数:
- LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
- LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
其中:
- x0:表示线性变化起始位置的x坐标
- y0:表示线性变化起始位置的y坐标
- x1:表示线性变化结束位置的x坐标
- y1:表示线性变化结束位置的y坐标
- colors:表示渲染的颜色,它是一个颜色数组,数组长度必须大于等于2
- positions:表示相对位置数组,表示colors数组中几个颜色的相对位置,是一个float类型的数组,该数组的长度必须与colors数组的长度相同。如果这个参数使用null也可以,这时系统会按照梯度线来均匀分配colors数组中的颜色。
- tile:表示平铺模式
先来看第一个构造函数:
val lgsShader = LinearGradient(0f, 0f, widthView / 4f, heightView/4f, colorResA, colorResB, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)
效果图:
实际上,线性变化的起始位置和结束位置用来指定线性变化的的方向,而起始位置和结束位置只不过是线性变化的方向的两个点。当然,它不仅决定了颜色线性变化的方向,同时还决定了渲染的位置。当需要渲染的尺寸超过线性变化的指定尺寸时,就交由Shader.TileMode来决定渲染的平铺模式。
关于Shader.TileMode前面已经做了介绍。下面来看,如果在X轴方向的颜色线性渲染,此时我们只需要将起始位置和结束位置的y坐标设置为0,也就是说在Y轴方向不做线性变化:
val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f, colorResA, colorResB, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)
效果图:
接下来看,第二个构造函数,与第一个构造函数不同的是,它需要制定一个颜色数组和颜色的相对位置数组:
val colorResA = resources.getColor(android.R.color.holo_red_dark)val colorResB = resources.getColor(android.R.color.holo_blue_dark)val colorResC = resources.getColor(android.R.color.black)val colorResD = resources.getColor(android.R.color.holo_green_dark)val colorArray = intArrayOf(colorResA, colorResB, colorResC, colorResD)val positionArray = floatArrayOf(0.0f, 0.3f, 0.4f, 1.0f)val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f, colorArray, positionArray, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)
效果图:
这里需要注意的是:
- 相对位置数组可以为NULL,当设置为NULL时,颜色沿梯度线性均匀变化
- 如果设置了相对位置数组,该数组的的大小必须与颜色数组的长度一致。因为它的值一一对应了颜色的值。
- 相对位置数组的值在0-1之间的Float值,它决定了相对应颜色的线变区间
- 颜色数组的长度必须大于2
现将位置数组设置为NULL,此时,颜色应沿梯度线性均匀变化,来看下效果图:
val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f, colorArray, null, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)
效果图:
若想了解更多Paint相关的内容,请跳入: 自定义View系列文章目录
如果觉得我的文章对您有用,请随意点赞、评论。您的支持将鼓励我继续创作!
阅读全文
0 0
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 自定义View之Paint
- 【Paint】Android 自定义View之Paint篇(更新中...)
- 自定义view(二):onDraw 之 Paint
- 自定义View (三) :onDraw 之 paint 画笔
- 自定义View(一)---Paint
- android 自定义View之 Paint类的介绍
- Android自定义View——Paint之Xfermode
- Android 自定义View之路——Paint
- Android ListView 异步加载图片错位的问题
- DirectX11环境配置
- 数据结构小结
- Android——BottomTabBar实现底部导航栏
- Java模块 -- WatchService监听服务
- 自定义View之Paint
- Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法
- 单源最短路(bellmanford&spfa)
- HDOJ 1266 Reverse Number
- multiple definition of XXX
- POJ 1789
- 2017.11.5 LeetCode
- 自定义View之Paint
- 容易遗忘的东西(持续添加中)