有可能有一个动画drawable吗?

cot*_*aws 9 animation android drawable progress-bar

是否可以创建具有某种动画的drawable,无论是逐帧动画,旋转等,它被定义为xml drawable并且可以由单个Drawable对象表示而无需处理动画在代码?

我如何使用它:我有一个列表,此列表中的每个项目可能在某个时候发生了一些事情.虽然它正在发生,但我希望有一个类似于不确定的ProgressBar的旋转进度动画.由于屏幕上可能还有其中的几个,我认为如果它们共享相同的Drawable,它们只需要在内存中有一个实例,它们的动画会被同步,所以你不会在各个点上有一堆旋转对象在旋转动画中.

我不喜欢这种方法.我只是想想一种最有效的方式来显示几个旋转进度动画,理想情况下将它们同步在一起,这样它们在外观上是一致的.

谢谢

回应Sybiam的回答:

我尝试过实现RotateDrawable但它没有旋转.

这是我到目前为止的drawable的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" />
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用drawable作为ImageView的src和背景,并且两种方式都只产生非旋转图像.

是否有必须开始图像旋转的东西?

Tim*_*mmm 16

是! 的(无证)键,这是我通过阅读发现ProgressBar代码是你要调用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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

MAX_LEVEL是一个常数,总是10000(根据文档). ANIM_PERIOD是动画的周期,以毫秒为单位.

不幸的是,因为你需要修改onDraw()你不能只把这个drawable放在一个,ImageView因为ImageView永远不会改变drawable级别.然而,你可能能够从改变绘制水平之外ImageView的.ProgressBar(ab)使用a AlphaAnimation来设置级别.所以你会做这样的事情:

mMyImageView.setImageDrawable(myDrawable);

ObjectAnimator anim = ObjectAnimator.ofInt(myDrawable, "level", 0, MAX_LEVEL);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.start();
Run Code Online (Sandbox Code Playgroud)

它可能有用,但我还没有测试过.

编辑

实际上有一种ImageView.setImageLevel()方法,因此它可能很简单:

ObjectAnimator anim = ObjectAnimator.ofInt(myImageVew, "ImageLevel", 0, MAX_LEVEL);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.start();
Run Code Online (Sandbox Code Playgroud)


Loï*_*oix 7

可绘

你去!而这一个用于RotateDrawable.我相信,从Doc开始它应该是非常紧张的前进.您可以在xml文件中定义所有内容,并将视图的背景设置为可绘制的xml./drawable/myrotate.xml - > @ drawable/myrotate

编辑:这是我在这里找到的答案. Drawable围绕其中心Android旋转

编辑2:你是对的,RotateDrawable似乎坏了.我不知道我也试过了.我还没有成功制作动画片.但我确实成功地轮换了它.你必须使用setLevel来旋转它.虽然看起来不太有用.我浏览了代码并且RotateDrawable甚至没有夸大动画持续时间,当前旋转似乎奇怪地使用关卡作为旋转度量.我相信你必须将它与AnimationDrawable一起使用,但在这里再次使用它.它只是为我坠毁.我还没有使用过这个功能,但计划将来使用它.我浏览了网页,RotateDrawable似乎与几乎每个Drawable对象都没有文档.


Vit*_*nko 1

您可以从研究API 演示项目中的ProgressBar2开始(它作为 SDK 的一部分提供)。具体要注意R.layout.progressbar_2