Android动画startOffset坏了还是马车?

时间:2010-10-25 12:04:13

标签: java android animation

我直接从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 根据页面说,逐字逐句也没有动画。似乎以完全相同的方式被打破!

有人有任何想法吗?

谢谢!

安迪。

3 个答案:

答案 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);