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
代码
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
构造函数
public BitmapShader(Bitmap bitmap,
Shader.TileMode tileX,
Shader.TileMode tileY)
Bitmap
:指定要使用的位图Bitmap
TileMode
:指定在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