Shader -> BitmapShader贴图着色器详解

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:指定要使用的位图Bitmap
  • TileMode:指定在XY方向上图像的重复或填充模式,可以是以下三种之一:
    • 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
相关推荐
星释1 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
悟能不能悟3 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
循环过三天3 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
_院长大人_4 小时前
设计模式-工厂模式
java·开发语言·设计模式
MATLAB代码顾问4 小时前
MATLAB实现决策树数值预测
开发语言·决策树·matlab
不染尘.6 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
似水এ᭄往昔6 小时前
【C++】--stack和queue
开发语言·c++
TDengine (老段)6 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
csbysj20206 小时前
R 绘图 - 散点图
开发语言
会跑的兔子7 小时前
Android 16 Kotlin协程 第一部分
android·开发语言·kotlin