我正在实现一个简单的翻转时钟/计数器/自动收报机小部件,它将由以下“数字”小部件的几个实例组成:
它是放置在背景图像顶部的数字。该数字应该通过向上滑动并显示下一个数字来每秒进行动画处理。在动画期间,两个数字都应保持在背景边界“内”。
我试图通过TextView
使用 2 行来实现这种行为 - 每行一个数字 - 并将 thisTextView
的位置向上设置动画,直到下一个数字完全可见。然后我会重置TextView
s 的位置,同时替换两个数字,这样就不可能注意到了。然后我会重复这个过程,让它看起来像动画永远不会结束。
在这里,您可以看到动画的中间状态,此时可以看到部分 0 和部分 9。layout_marginTop
通过将属性设置为负值,我在 Eclipse 的图形布局编辑器中“模拟”了它。
这是布局文件(提到的属性通常不存在)。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="20dp"
android:layout_height="38dp"
android:background="@drawable/background_countdown_normal_grey"
android:clipChildren="false" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/textview_countdown_digit"
style="@style/TextView.CountdownDigit"
android:layout_marginTop="-12dp"
android:text="0\n9" />
</LinearLayout>
</LinearLayout>
我尝试了两种解决方案。通过使用ViewPropertyAnimator
ontranslateY
或y
,我得到了一个流畅的动画,但是在动画过程中原始剪辑TextView
不会改变,所以实际上第二个数字永远不可见。如您所见,我尝试clipChildren
了属性,但它似乎没有改变任何东西。
我的第二种方法是使用ValueAnimator
自定义,Evaluator
它修改topMargin
了LayoutParams
. TextView
它可以工作,但即使在高端设备上,动画也很不稳定。
所以我的问题是,如何避免动画期间的视图剪辑并以有效的方式进行剪辑?有更好的方法吗?