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
相关推荐
Highcharts.js5 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员6 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
xingxiliang7 小时前
深入浅出 Android CTS 视频测试:从环境搭建、用例设计到底层通信原理
android·音视频
我命由我123457 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友8 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华8 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.9 小时前
C++:语句和作用域
开发语言·c++
雨白9 小时前
深入理解 Kotlin 协程 (八):拾遗补阙,探秘官方框架的调度细节与取消闭环
android·kotlin
wanderist.9 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
海天鹰10 小时前
PHP上传文件
android·开发语言·php