ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 1. 前言 Shader 在三维软件中被称为着色器,是用来给空白图形上色的。在 Photoshop 中有一个印 章工具,能够指定印章的样式来填充图形。Paint 中有一个函数专门用于设置 Shader: ``` public Shader setShader(Shader shader) ``` Shader 类其实是一个空类,它的功能主要是靠它的派生类来实现的,有BitmapShader、ComposeShader、LinearGradient、RadialGradient、SweepGradient。 # 2. BitmapShader 其构造函数如下: ``` public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY) ``` 这就相当于 Photoshop 中的印章工具,bitmap用来指定图案,tileX 用来指定当 X 轴超出 单张图片大小时所使用的重复策略,tileY 用来指定当 Y 轴超出单张图片大小时所使用的重复策略。 TileMode 的取值如下。 * TileMode.CLAMP:用边缘色彩来填充多余空间。 * TileMode.REPEAT:重复原图像来填充多余空间。 * TileMode.MIRROR:重复使用镜像模式的图像来填充多余空间。 因为其重复策略模式的不同,这里可以用来做一些简单的案例。 ## 2.1 圆形图片——Shader结合Matrix实现 效果: ![](https://img.kancloud.cn/89/6f/896f2b816a011ced5c11ba89f858ebe0_440x273.png) 代码: ~~~ class ShaderDemo : View { constructor(context: Context?) : super(context) { init() } constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { init() } constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( context, attrs, defStyleAttr ) { init() } private lateinit var mContentBitmap: Bitmap private lateinit var mPaint: Paint private fun init() { // 创建背景Bitmap mPaint = Paint() mPaint.color = Color.RED mPaint.strokeWidth = 5f mPaint.isAntiAlias = true mPaint.style = Paint.Style.FILL mPaint.isDither = true mPaint.textSize = Tool.dp2px(resources, 30f) // 得到资源文件的Bitmap对象 mContentBitmap = BitmapFactory.decodeResource(resources, R.drawable.b) // 应用matrix变换 val matrix= Matrix() val scale = 80f / mContentBitmap.width // 缩放倍率,圆形坐标 matrix.setScale(scale, scale, 200f, 200f) // 创建BitmapShader,用来作为背景层 val shader = BitmapShader(mContentBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) // 设置Shader的变换矩阵 shader.setLocalMatrix(matrix) // 为画笔mPaint设置一个Shader mPaint.setShader(shader) } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) // 为了明显,这里为画布添加一个灰色的背景色 canvas?.drawColor(Color.GRAY) // 绘制一个圆 canvas?.drawCircle(200f, 200f, 80f, mPaint) } } ~~~ 在这里为了保证所加载的资源R.drawable.b可以填充整个圆形区域,这里对这个BitmapShader应用了矩阵缩放。然后为画笔设置Shader来进行圆形的背景使用图片填充,做到圆角图片效果。 ## 2.2 圆角矩形图片 当然,可以绘制一个圆角矩形的,这类仅修改onDraw函数: ~~~ override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) // 为了明显,这里为画布添加一个灰色的背景色 canvas?.drawColor(Color.GRAY) // 绘制一个圆角矩形 val rectF = RectF(100f, 100f, 300f, 300f) canvas?.drawRoundRect(rectF, 15f, 15f, mPaint) } ~~~ 效果: ![](https://img.kancloud.cn/ed/d5/edd55e04df6e6b0db7b4c0d3ed68add1_562x335.png) 当然,也可以来尝试下发光效果,为画笔设置: ~~~ // 设置内发光 val maskFilter = BlurMaskFilter(5f, BlurMaskFilter.Blur.NORMAL) mPaint.setMaskFilter(maskFilter) ~~~ 效果: ![](https://img.kancloud.cn/20/5d/205dad09aaf71177765dd6ad8fda9acf_757x499.png)