BitmapShader使用遇到的一点问题

182 阅读1分钟

通过Shader绘制一张图片我们需要记住,Shader永远是按照原点进行h绘制的.比如下面这个例子:

class SS : View {
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs){
        initPaint()
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawRect(0f, 0f, paintWidth.toFloat(), paintWidth.toFloat(), mPaint)
    }

    var mPaint = Paint()
    var paintWidth = 140
    fun initPaint() {
    var bitmap =
            Bitmap.createBitmap(paintWidth, paintWidth, Bitmap.Config.ARGB_8888);
        var c2 = Canvas(bitmap);
        var p2 = Paint(Paint.ANTI_ALIAS_FLAG);
        p2.color = resources.getColor(R.color.purple_500)
        c2.drawCircle(paintWidth / 2f, paintWidth / 2f, paintWidth / 2f, p2)
        var shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
        mPaint.shader = shader
    }
}

我们在onDraw里面调用drawRect绘制了一个矩形.起始点是0,0.结果就是你在左上角看到了一个圆形.

image.png

现在改下onDraw里面的代码:

 canvas.drawRect(40f, 40f, 40+paintWidth.toFloat(), 40+paintWidth.toFloat(), mPaint)

image.png 可以看到是一个畸形的存在.

这个问题就是出在我们的shader永远是按照左上角0,0坐标进行绘制的.所以在外面绘制位置改变的时候,我们的shader的坐标也要进行修改.通过matrix进行修改:

override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    var m = Matrix()
    mPaint.shader.getLocalMatrix(m)
    m.setTranslate(
        40f,
        40f
    )
    mPaint.shader.setLocalMatrix(m)
    canvas.drawRect(40f, 40f, 40+paintWidth.toFloat(),40+ paintWidth.toFloat(), mPaint)
}