android - 是否可以使用动画绘图?

标签 android animation progress-bar drawable

是否可以创建具有某种动画的可绘制对象,无论是逐帧动画、旋转等,定义为 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/

相关文章:

android - Intent 自定义权限不起作用

android - 我将如何在自定义 ListView 中使用搜索

android - 在 Android Studio Marketplace 中找不到 HMS Toolkit

android - 具有多色的自定义 ProgressBar

cocoa - 在 cocoa 中下载带有进度条的文件?

按下后退按钮后 Android ViewPager 异常

jquery - 用jquery制作 explode 动画

javascript - CSS3改变动画持续时间(速度)动画中期

python - 如何检查键盘按钮是否收到垃圾邮件并在再次按下之前添加冷却时间

java - 有没有一种通用的方法可以在 Android 的 View 上显示进度条?