背景
我知道可以创建一个可绘制对象(或位图)的旋转版本,这样(写过关于它的here https://stackoverflow.com/a/21376008/878126) :
@JvmStatic
fun getRotateDrawable(d: Drawable, angle: Int): Drawable {
if (angle % 360 == 0)
return d
return object : LayerDrawable(arrayOf(d)) {
override fun draw(canvas: Canvas) {
canvas.save()
canvas.rotate(angle.toFloat(), (d.bounds.width() / 2).toFloat(), (d.bounds.height() / 2).toFloat())
super.draw(canvas)
canvas.restore()
}
}
}
问题
我想要拥有autoMirrored
设置为某个可绘制对象(在我的情况下为 VectorDrawable),如果设备的区域设置为 RTL,则会翻转(镜像,以便左为右,右为左,但不影响顶部和底部)。
举个例子(这只是一个例子!),如果你使用一个显示左箭头的可绘制对象,翻转后它将是一个右箭头。
遗憾的是,这仅在 API 19 中可用。
这就是为什么我决定用它制作一个新的 Drawable,作为原始 Drawable 的翻转版本
我尝试过的
我发现一篇很好的文章对视图做了同样的事情,here http://shaikhhamadali.blogspot.co.il/2013/08/image-flipping-mirroring-in-imageview.html,使用矩阵。所以我尝试过这个:
@JvmStatic
fun getMirroredDrawable(d: Drawable): Drawable {
return object : LayerDrawable(arrayOf(d)) {
override fun draw(canvas: Canvas) {
canvas.save()
val matrix = Matrix()
// use this for the other flipping: matrix.preScale(1.0f, -1.0f)
matrix.preScale(-1.0f, 1.0f);
canvas.matrix = matrix
super.draw(canvas)
canvas.restore()
}
}
}
遗憾的是,由于某种原因,这使得可绘制对象根本没有显示。也许它确实有效,但试图超出显示它的任何视图的范围。
问题
如何制作给定 Drawable 的翻转版本,类似于旋转 Drawable 所做的操作?
解决方案:
基于下面建议的答案(here https://stackoverflow.com/a/48502102/878126),这是一个很好的方法:
fun Drawable.getMirroredDrawable(): Drawable {
return object : LayerDrawable(arrayOf(this)) {
val drawingRect = Rect()
val matrix = Matrix()
override fun draw(canvas: Canvas) {
matrix.reset()
matrix.preScale(-1.0f, 1.0f, canvas.width / 2.0f, canvas.height / 2.0f)
canvas.matrix = matrix
drawingRect.left = (canvas.width - intrinsicWidth) / 2
drawingRect.top = (canvas.height - intrinsicHeight) / 2
drawingRect.right = drawingRect.left + intrinsicWidth
drawingRect.bottom = drawingRect.top + intrinsicHeight
if (bounds != drawingRect)
bounds = drawingRect
super.draw(canvas)
}
}
}