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
相关推荐
2501_9160137410 分钟前
iOS 上架 App 全流程实战,应用打包、ipa 上传、App Store 审核与工具组合最佳实践
android·ios·小程序·https·uni-app·iphone·webview
2501_9151063219 分钟前
iOS 26 能耗监测全景,Adaptive Power、新电池视图
android·macos·ios·小程序·uni-app·cocoa·iphone
Madison-No719 分钟前
【C++】探秘string的底层实现
开发语言·c++
lly2024061 小时前
AJAX JSON 实例
开发语言
用户2018792831671 小时前
浅谈Android PID与UID原理
android
QiZhang | UESTC1 小时前
JAVA算法练习题day27
java·开发语言·c++·算法·leetcode·hot100
坚持就完事了1 小时前
2-C语言中的数据类型
c语言·开发语言
TimeFine1 小时前
Android AWS KVS WebRTC 通话声道切换到媒体音乐声道
android
ss2732 小时前
手写MyBatis第96弹:异常断点精准捕获MyBatis深层BUG
java·开发语言·bug·mybatis
Stanford_11062 小时前
关于嵌入式硬件需要了解的基础知识
开发语言·c++·嵌入式硬件·微信小程序·微信公众平台·twitter·微信开放平台