是否可以创建具有某种动画的可绘制对象,无论是逐帧动画、旋转等,定义为 xml 可绘制对象并且可以由单个可绘制对象表示而无需处理用代码中的动画?
我想如何使用它: 我有一个列表,这个列表中的每个项目有时可能会发生一些事情。当它发生时,我想要一个类似于不确定 ProgressBar 的旋转进度动画。因为屏幕上可能还有几个这样的东西,我想如果它们都共享同一个 Drawable,它们只需要在内存中有一个实例,它们的动画就会同步,这样你就不会在不同的点上有一堆旋转的对象了在旋转动画中。
我不喜欢这种方法。我只是在想最有效的方式来显示几个旋转的进度动画,理想情况下让它们同步在一起,这样它们在外观上是一致的。
谢谢
针对 Sybiam 的回答:
我已经尝试实现一个 RotateDrawable,但它没有旋转。
到目前为止,这是我的可绘制对象的 xml:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/my_drawable_to_rotate"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="800"
android:visible="true" />
我尝试过使用该可绘制对象作为 ImageView 的 src 和背景,这两种方式都只生成了非旋转图像。
有什么东西必须启动图像旋转吗?
最佳答案
是的!我通过阅读 ProgressBar
发现的(未记录的) key 代码是你必须调用Drawable.setLevel()
在 onDraw()
为了 <rotate>
有任何影响的事情。 ProgressBar
像这样工作(省略了额外不重要的代码):
可绘制的 XML:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<rotate
android:drawable="@drawable/spinner_48_outer_holo"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="1080" />
</item>
<item>
<rotate
android:drawable="@drawable/spinner_48_inner_holo"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="720"
android:toDegrees="0" />
</item>
</layer-list>
在onDraw()
:
Drawable d = getDrawable();
if (d != null)
{
// Translate canvas so a indeterminate circular progress bar with
// padding rotates properly in its animation
canvas.save();
canvas.translate(getPaddingLeft(), getPaddingTop());
long time = getDrawingTime();
// I'm not sure about the +1.
float prog = (float)(time % ANIM_PERIOD+1) / (float)ANIM_PERIOD;
int level = (int)(MAX_LEVEL * prog);
d.setLevel(level);
d.draw(canvas);
canvas.restore();
ViewCompat.postInvalidateOnAnimation(this);
}
MAX_LEVEL
是一个常数,并且始终为 10000(根据文档)。
ANIM_PERIOD
是以毫秒为单位的动画周期。
很遗憾,因为您需要修改 onDraw()
你不能把这个 drawable 放在 ImageView
中自 ImageView
从不更改可绘制级别。但是,您可以从 ImageView
之外更改可绘制级别的。 ProgressBar
(ab) 使用 AlphaAnimation
设置电平。所以你会做这样的事情:
mMyImageView.setImageDrawable(myDrawable);
ObjectAnimator anim = ObjectAnimator.ofInt(myDrawable, "level", 0, MAX_LEVEL);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.start();
它可能有效,但我还没有测试过。
编辑
实际上有一个ImageView.setImageLevel()
方法,所以它可能很简单:
ObjectAnimator anim = ObjectAnimator.ofInt(myImageVew, "ImageLevel", 0, MAX_LEVEL);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.start();
关于android - 是否可以使用动画绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4651618/