gpt4 book ai didi

android - 如何获得一个不同 Drawable 的镜像版本的 Drawable?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:57:12 27 4
gpt4 key购买 nike

背景

我知道可以创建 Drawable(或位图)的旋转版本,因此(关于它的文章 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 设置为某个可绘制对象(在我的例子中是 VectorDrawable),它会翻转(镜像,这样左边就是右边,右边就是左边,但不影响顶部和底部)以防设备的区域设置为 RTL。

举个例子(这只是一个例子!),如果你拿一个显示左箭头的可绘制对象,翻转后它将是一个右箭头。

遗憾的是,这仅适用于 API 19。

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

我尝试过的

我找到了一篇对 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)
}
}
}

最佳答案

指定翻转操作的中心。

matrix.preScale(-1.0f, 1.0f, canvas.getWidth() / 2, canvas.getHeight() / 2);

这是一个自定义的 Drawable 类,您可以使用它来镜像 drawables:

public class MirroredDrawable extends Drawable {
final Drawable mDrawable;
final Matrix matrix = new Matrix();

MirroredDrawable(Drawable drawable) {
mDrawable = drawable;
}

@Override
public void draw(@NonNull Canvas canvas) {
matrix.reset();
matrix.preScale(-1.0f, 1.0f, canvas.getWidth() / 2, canvas.getHeight() / 2);
canvas.setMatrix(matrix);

Rect drawingRect = new Rect();
drawingRect.left = (canvas.getWidth() - mDrawable.getIntrinsicWidth()) / 2;
drawingRect.top = (canvas.getHeight() - mDrawable.getIntrinsicHeight()) / 2;
drawingRect.right = drawingRect.left + mDrawable.getIntrinsicWidth();
drawingRect.bottom = drawingRect.top + mDrawable.getIntrinsicHeight();
mDrawable.setBounds(drawingRect);
mDrawable.draw(canvas);
}

// Other methods required to extend Drawable but aren't used here.

@Override
public void setAlpha(int alpha) { }

@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) { }

@Override
public int getOpacity() { return PixelFormat.OPAQUE; }
}

以下是它的应用方式:

    Drawable drawable = getResources().getDrawable(R.drawable.your_drawable);
getSupportActionBar().setHomeAsUpIndicator(new MirroredDrawable(drawable));

关于android - 如何获得一个不同 Drawable 的镜像版本的 Drawable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com