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
相关推荐
paterWang1 小时前
基于 Python 和 OpenCV 的酒店客房入侵检测系统设计与实现
开发语言·python·opencv
东方佑1 小时前
使用Python和OpenCV实现图像像素压缩与解压
开发语言·python·opencv
太空漫步112 小时前
android社畜模拟器
android
我真不会起名字啊2 小时前
“深入浅出”系列之杂谈篇:(3)Qt5和Qt6该学哪个?
开发语言·qt
laimaxgg2 小时前
Qt常用控件之单选按钮QRadioButton
开发语言·c++·qt·ui·qt5
水瓶丫头站住2 小时前
Qt的QStackedWidget样式设置
开发语言·qt
小钊(求职中)3 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
海绵宝宝_4 小时前
【HarmonyOS NEXT】获取正式应用签名证书的签名信息
android·前端·华为·harmonyos·鸿蒙·鸿蒙应用开发
慕诗客5 小时前
QT基于Gstreamer采集的简单示例
开发语言·qt
Blasit5 小时前
C++ Qt建立一个HTTP服务器
服务器·开发语言·c++·qt·http