android drawable -1,android – 如何获得一个Drawable,它是另一个Drawable的镜像版本?

博客内容讲述了如何在Android中创建Drawable的翻转和旋转版本。作者首先展示了如何通过旋转一个Drawable,然后探讨了如何制作一个镜像Drawable,特别是对于VectorDrawable,以适应RTL(从右到左)布局。然而,直接使用Matrix导致Drawable不显示,作者最终提供了一个解决方案,通过调整Matrix和Drawable的边界来正确显示翻转效果。
摘要由CSDN通过智能技术生成

背景

我知道可以创建一个Drawable(或Bitmap)的旋转版本,因此(写成here):

@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设置为一些drawable(在我的情况下是VectorDrawable),它会翻转(镜像使得左边是右边,右边是左边,但不影响顶部和底部),以防设备的区域设置是RTL .

作为一个例子(这只是一个例子!),如果你拿一个显示左箭头的drawable,翻转后它将是一个右箭头.

遗憾的是,这只能从API 19获得.

这就是为什么我决定用它制作一个新的Drawable,成为原版的翻版

我试过的

我找到了一篇很好的文章,使用Matrix对View,here做同样的事情.所以我试过这个:

@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()

}

}

}

可悲的是,出于某种原因,这使得抽签根本没有显示出来.也许它确实有效,但试图从它显示它的任何View的界限中展示出来.

这个问题

如何制作给定Drawable的翻转版本,类似于我为旋转Drawable所做的操作?

解:

基于下面建议的答案(here),这是一个很好的方法:

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)

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值