View的繪制 之 clip、translate、rotate、Camera

Canvas

       canvas.drawBitmap(bitmap, 0f, 0f, paint)
原圖

clip

        canvas.clipRect(0.25f * bitmap.width, 0f, 0.75f * bitmap.width, bitmap.height.toFloat())
        canvas.drawBitmap(bitmap, 0f, 0f, paint)
拆切后

translate, rotate

        canvas.translate(300f, 0f)
        canvas.rotate(30f)
image.png

rotate clip

        canvas.rotate(degree, centerX, centerY)  //旋轉(zhuǎn)canvas
        canvas.clipRect(0f, 0f, centerX, vHeight)  // clip,獲得一個斜切的繪制區(qū)域
        canvas.rotate(-degree, centerX, centerY)  // 旋轉(zhuǎn)會畫布,一遍后面水品繪制bitmap
        canvas.drawBitmap(bitmap, centerX - bWidth / 2, centerY - bHeight / 2, paint)
rotate clip

scale

        canvas.scale(1f, 2f, centerX, centerY)
        canvas.drawBitmap(bitmap, centerX - bWidth / 2, centerY - bHeight / 2, paint)
scale y 2x

skew

image.png

Camera rotate

        canvas.translate(centerX, centerY)
        camera.rotateX(60f)
        camera.applyToCanvas(canvas)
        canvas.translate(-centerX, -centerY)
        canvas.drawBitmap(bitmap, centerX - bWidth / 2, centerY - bHeight / 2, paint)
image.png

綜合應(yīng)用

核心代碼

        canvas.save()
        canvas.save()
        camera.save()

        canvas.translate(centerX, centerY)
        canvas.rotate(degreeZ)
        canvas.clipRect(-centerX, centerY, 0f, -centerY)    // 旋轉(zhuǎn)之后 clip 得到一個 斜切的可繪制區(qū)域
        camera.rotateY((leftDegreeY))
        camera.applyToCanvas(canvas)
        canvas.rotate(-degreeZ)     // 反方向旋轉(zhuǎn)回來,以便bitmap能夠水品繪制
        canvas.translate(-centerX, -centerY)
        canvas.drawBitmap(bitmap, x, y, paint);

        canvas.restore()
        camera.restore()

ezgif.com-gif-maker (2).gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。