Android动画startOffset坏了还是马车?

And*_*ndy 5 java animation android

我直接从android文档中获取了一些动画xml,据我所知,它不适用于我的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> 
Run Code Online (Sandbox Code Playgroud)

所以我想要实现的是将视图从大小缩小到一半以上,然后将其恢复到原始大小超过一秒.所以重新迭代,超过两秒它应该从原始 - >半尺寸 - >原始.

实际发生的是它瞬间捕捉到一半的视图大小(即使从X/YScale为1.0),然后执行动画超过两秒钟,然后快速恢复到原始大小.

其他人可以快速尝试一下吗?如果其他人看到这种行为,我会将其作为错误提交.我简直无法相信一些基本的东西可能被打破!?

此外,在此页面上的"Tween Animation"标题下复制此动画http://developer.android.com/guide/topics/graphics/2d-graphics.html 逐字逐句也不按照页面说明的动画.似乎以完全相同的方式被打破!

有人有任何想法吗?

谢谢!

安迪.

Ton*_*han 5

我最近发现的并且对动画的不良行为负有部分责任的事实是<set>标签中使用的许多XML属性不起作用!

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

由于一个荒谬的错误/缺陷,Android将忽略此属性,这将导致您的第二个<set>动画子项与您的父项同时启动<set>

更令人沮丧的是,这个属性在代码中以编程方式工作,setStartOffset()而不是在XML中工作.

我花了几个令人沮丧的时间来确定哪些属性在代码和XML中用于AnimationSets并在此处提交了错误报告/问题:问题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.

不用说,这会引起很多不必要的挫折.


Reu*_*ton 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" />
Run Code Online (Sandbox Code Playgroud)