如何使用“可旋转绘制”?

2022-09-03 08:14:52

谁能告诉我他们是如何工作的,无论是从代码还是XML,还是两者兼而有之?关于绘制绘图片动画的文档非常差,动画似乎只适用于图像。我希望能够对所有可绘制对象进行动画处理。当我试图从XML获取一个只是导致异常。从 XML 查找的正确函数是什么?RotateDrawableRotateDrawbleRotateDrawable


答案 1

这是一个很好的解决方案,用于为图像放置旋转的可绘制对象View:

Drawable getRotateDrawable(final Bitmap b, final float angle) {
    final BitmapDrawable drawable = new BitmapDrawable(getResources(), b) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, b.getWidth() / 2, b.getHeight() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
    return drawable;
}

用法:

Bitmap b=...
float angle=...
final Drawable rotatedDrawable = getRotateDrawable(b,angle);
root.setImageDrawable(rotatedDrawable);

另一种选择:

private Drawable getRotateDrawable(final Drawable d, final float angle) {
    final Drawable[] arD = { d };
    return new LayerDrawable(arD) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, d.getBounds().width() / 2, d.getBounds().height() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
}

另外,如果您希望旋转位图,但又害怕OOM,则可以使用我在这里制作的NDK解决方案


答案 2

您必须对“level”属性进行动画处理,其中 0 是起始值,10000 是结束值。

下面的示例从头到尾进行动画处理,您可以使用此方法轻松反转动画。

final RotateDrawable rotateDrawable = ...
ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000).start();

推荐