我直接从android文档中获取了一些动画xml,并且as 我可以看到,无法在我的2.1更新1模拟器或 我的2.1更新1 Galaxy S设备。
具体来说,我正在尝试创建一个动画来脉动视图 (即在一个动画中使其变小然后变大) 这是非常简单的标记:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:toXScale="0.5"
android:fromYScale="1.0"
android:toYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="1000" />
<set android:startOffset="1000">
<scale
android:fromXScale="0.5"
android:toXScale="1.0"
android:fromYScale="0.5"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="1000" />
</set>
</set>
所以我想要实现的是将视图从大小缩小到 一半超过一秒钟,然后将其增加回原来的一半 大小超过一秒。所以重新迭代,超过两秒它应该从原来 - &gt;半尺寸 - &gt;原始
实际发生的是它立即捕捉到一半的视图大小 (即使fromX / YScale为1.0),然后在两秒钟内执行动画 并在之后快速恢复到原始大小。
其他人可以快速尝试一下吗?如果其他人看到这种行为 我会把它作为一个bug提交。我简直无法相信这么基本的东西 被打破了!?
此外,在“Tween Animation”标题下复制此动画 这个页面http://developer.android.com/guide/topics/graphics/2d-graphics.html 根据页面说,逐字逐句也没有动画。似乎以完全相同的方式被打破!
有人有任何想法吗?
谢谢!
安迪。
答案 0 :(得分:5)
我最近发现并且对动画的不良行为负有部分责任的事实是<set>
标记中使用的许多XML属性都不起作用!
在您的代码示例中,您有<set android:startOffset="1000">
由于存在一个荒谬的错误/缺陷,Android会忽略此属性,这会导致您的第二个动画<set>
动画与您的父<set>
同时启动
这更令人沮丧的是,此属性以编码方式在代码setStartOffset()
中工作,但在XML中不工作。
我花费了几个令人沮丧的时间来确定哪些属性在AnimationSet
的代码和XML中有效,并在此处提交了错误报告/问题:Issue 17662
总结:
setRepeatCount()/ android:repeatCount
此属性(以及repeatMode)在代码或XML中不起作用。这使得重复整套动画变得困难。
setDuration()/ android:duration
在代码WORKS中的AnimationSet上设置此项(覆盖子动画的所有持续时间),但不包含在XML中的标记中
setFillAfter()/ android:fillAfter
这适用于标记的代码和XML。奇怪的是,我已经让它也可以在不需要将fillEnabled设置为true的情况下工作。
setFillBefore()/ android:fillBefore
似乎在代码和XML中都没有效果/忽略
setFillEnabled()/ android:fillEnabled
似乎在代码和XML中都没有效果/被忽略。即使没有包含fillEnabled或将fillEnabled设置为false,我仍然可以使fillAfter工作。
setStartOffset()/ android:startOffset
这仅适用于代码,而不适用于XML。
毋庸置疑,这会引起很多不必要的挫折。
答案 1 :(得分:3)
我删除了第二个<set>
代码,因此只有一个<set>
有两个<scale>
个孩子。这让一个循环工作正常,但没有重复。也许你必须听动画结束并手动重启(所以偏移从每次0开始)。
从好的方面来说,我只能使用一个标签来repeatMode
来达到您想要的效果:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:repeatMode="reverse"
android:fromXScale="1.0"
android:toXScale="0.5"
android:fromYScale="1.0"
android:toYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="1000" />
答案 2 :(得分:2)
请尝试以下代码。缺少的是repeatMode =&#34; -1&#34;在之前的回答中。然后你会在不使用听众的情况下无限期地看到图像脉动。
在res / anim / pulsate.xml中:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="0.5"
android:fromYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:repeatMode="reverse"
android:repeatCount="-1"
android:toXScale="1.0"
android:toYScale="1.0" />
在java文件中:
Animation animPulsate = AnimationUtils.loadAnimation(JoinRecipeClubActivity.this, R.anim.pulsate);
ImageView ivFinger = (ImageView) findViewById(R.id.wivFinger);
ivFinger.startAnimation(animPulsate);