XML文件
xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.myapplication.MyView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
自定义View代码
kotlin
class MyView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private var mDrawRect = RectF()
private var mDrawPaint = Paint()
private var mOriginBitmap = BitmapFactory.decodeResource(resources, R.drawable.bitmap_shader)
private var mScaleBitmap : Bitmap ?= null
private var mDrawShader : BitmapShader ?= null
private val targetWidth = 300
private val targetHeight = 300
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())
mScaleBitmap = Bitmap.createScaledBitmap(mOriginBitmap, targetWidth, targetHeight, true)
mScaleBitmap?.let {
mDrawShader = BitmapShader(it, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)
}
mDrawPaint.shader = mDrawShader
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
mDrawPaint?.let {
canvas.drawRect(mDrawRect, it)
}
}
}
BitmapShader贴图着色器参数详解
BitmapShader贴图着色器赋值给Paint画笔,可以使用Canvas画布和Paint画笔绘制具有贴图Bitmap的内容,包括Rect,Paint,Path,Circle
构造函数
kotlin
public BitmapShader(Bitmap bitmap, // 要用作着色器的位图
Shader.TileMode tileX, // X方向的平铺模式
Shader.TileMode tileY) // Y方向的平铺模式
Bitmap:指定要使用的位图BitmapTileMode:指定在X和Y方向上图像的重复或填充模式,可以是以下三种之一:Shader.TileMode.CLAMP:边缘填充模式,使用边缘颜色填充Shader.TileMode.REPEAT:重复填充模式,重复图像Shader.TileMode.MIRROR:镜像填充模式,图像交替翻转
映射方式Shader.TileMode决定了这张Bitmap如何绘制到着色器绘制区域上
- 着色器绘制区域是使用
Canvas画布的大小,往往比这张Bitmap的区域大得多
x轴上: Shader.TileMode.CLAMP, y轴上: Shader.TileMode.CLAMP
- 作用:这张
Bitmap只会在x轴和y轴上绘制一次,剩余的绘制区域用这张Bitmap的边缘颜色去拉伸填充

x轴上: Shader.TileMode.REPEAT, y轴上: Shader.TileMode.REPEAT
- 作用:这张
Bitmap只会在x轴和y轴上多次绘制,剩余的绘制区域用这张Bitmap重复填充,不修改Bitmap的方向

x轴上: Shader.TileMode.REPEAT, y轴上: Shader.TileMode.REPEAT
- 作用:这张
Bitmap只会在x轴和y轴上多次绘制,剩余的绘制区域用这张Bitmap重复填充,修改Bitmap的方向,x轴上绘制的Bitmap是x轴上一次绘制的Bitmap的镜像对称Bitmap,y轴上绘制的Bitmap是y轴上一次绘制的Bitmap的镜像对称Bitmap
