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,
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