2010-10-25 172 views
5

我已经采取了一些动画xml直接从android文档,并作为 尽我所知,无法在我的2.1更新1仿真器或 我的2.1更新1 Galaxy S设备。Android动画startOffset损坏或越野车?

具体来说,我想创建一个动画来搏动视图 (即使其变小,然后在一个动画大) 这是非常简单的标记:

<?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> 

所以我什么试图实现的目标是将视图从其大小减少到 一秒以上,然后在一秒钟之内将其增加回原始大小 。因此,重新迭代,超过两秒钟,它应该从原始 - >半尺寸 - >原始。

实际情况是什么瞬间捕捉到的意见尺寸 (即使fromX/YScale为1.0)的一半,然后执行可以在两秒内 动画和弹回原来的大小之后。

其他人可以快速试用吗?如果其他人看到此行为 我会将其作为错误提交。我简直不敢相信如此基本的东西可以打破!

此外,复制此动画在“补间动画”标题下的 此页面http://developer.android.com/guide/topics/graphics/2d-graphics.html word for word也不会根据页面动画显示。似乎以完全相同的方式被打破!

任何人有任何想法?

谢谢!

Andy。

回答

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" /> 
+0

快到了!我需要添加android:repeatCount =“1”才能工作,否则它会缩小动画并捕捉回来(而不是回放动画)。无论哪种方式,它与这个加法一起工作!谢谢一堆! :)在一个侧面说明中,我实际上尝试了这种方法,尽管它在代码中,但它没有重复,尽管重复计数总是会被捕获! Android文档再次失败! ;) – Andy 2010-10-25 13:54:38

+0

对不起,我忘记了一点细节(我在代码中完成的,而不是XML)。 – 2010-10-25 14:12:12

5

东西,我最近发现,是不需要的行为负有部分责任你的动画是在<set>标签中使用的许多XML属性不起作用的事实!

在你的代码示例,你有<set android:startOffset="1000">

因为一个可笑的错误/缺陷,Android将会忽略这个属性,这将导致你的第二个孩子的动画<set>与你的父母同时启动<set>

是什么让这更令人沮丧的是,该属性在代码setStartOffset()中以编程方式工作,但不在XML中。

我花了几个令人沮丧小时搞清楚哪些属性的工作代码和XML为AnimationSet S和提交错误报告/问题在这里:Issue 17662

总结:

setRepeatCount()/安卓:repeatCount

此属性(以及repeatMode)在代码或XML中不起作用。这使得重复一整套动画变得困难。

setDuration()/ Android的:持续时间

在代码工作的AnimationSet设置这个(覆盖儿童动画的所有时长),但不包括在XML标签时

setFillAfter()/ android:fillAfter

这适用于标签的代码和XML。奇怪的是,我已经得到它也没有需要将fillEnabled设置为true的工作。

setFillBefore()/机器人:fillBefore

似乎没有任何效果/两个代码和XML

setFillEnabled()/机器人忽略:fillEnabled

似乎在代码和XML中都没有效果/被忽略。即使不包含fillEnabled或将fillEnabled设置为false,我仍然可以获取fillAfter工作。

setStartOffset()/安卓开始偏移

这只有在代码,而不是XML。

不用说,这会造成很多不必要的挫折。

2

请尝试以下代码。缺少的是前一个答案中的repeatMode =“-1”。然后,您将看到图像无限期脉动,而不使用侦听器。

在res /动画/ 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);