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)
你去!而这一个用于RotateDrawable.我相信,从Doc开始它应该是非常紧张的前进.您可以在xml文件中定义所有内容,并将视图的背景设置为可绘制的xml./drawable/myrotate.xml - > @ drawable/myrotate
编辑:这是我在这里找到的答案. Drawable围绕其中心Android旋转
编辑2:你是对的,RotateDrawable似乎坏了.我不知道我也试过了.我还没有成功制作动画片.但我确实成功地轮换了它.你必须使用setLevel来旋转它.虽然看起来不太有用.我浏览了代码并且RotateDrawable甚至没有夸大动画持续时间,当前旋转似乎奇怪地使用关卡作为旋转度量.我相信你必须将它与AnimationDrawable一起使用,但在这里再次使用它.它只是为我坠毁.我还没有使用过这个功能,但计划将来使用它.我浏览了网页,RotateDrawable似乎与几乎每个Drawable对象都没有文档.
归档时间: |
|
查看次数: |
29226 次 |
最近记录: |