我正在实现一个简单的翻转时钟/计数器/自动收报机小部件,它将包含以下“数字”小部件的多个实例:
这是一个放在背景图像上方的数字。该数字应该通过向上滑动并显示下一个数字来动画每秒。在动画期间,两个数字都应该保持在背景边界内。
我试图通过让TextView
包含2行 - 每行一位数 - 并向上调整此TextView
的位置来实现此行为,直到下一个数字完全可见。然后我将重置TextView
的位置并同时替换两个数字,这样就无法注意到了。然后我将重复这个过程,让它看起来像动画永远不会结束。
在这里你可以看到动画的中间状态,当部分零和九部分可见时。我通过将layout_marginTop
属性设置为负值,在Eclipse的Graphical Layout编辑器中“嘲笑”它。
这是布局文件(提到的属性通常不存在)。
<?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
或translateY
上使用y
,我得到了一个平滑的动画,但TextView
的原始剪辑在动画期间不会改变,因此实际上是第二个数字永远不可见。正如您所看到的,我尝试了clipChildren
属性,但它似乎没有改变任何东西。
我的第二种方法是将ValueAnimator
与自定义Evaluator
一起使用,这会修改topMargin
上LayoutParams
的{{1}}。它很有效,但即使在高端设备上,动画也非常不稳定。
所以我的问题是,如何避免动画期间的视图剪辑并以有效的方式制作?有更好的方法吗?
答案 0 :(得分:0)
我找到了另一种解决方案,我在其中使用ScrollView。我的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollview_countdown_digit"
android:layout_width="20dp"
android:layout_height="38dp"
android:background="@drawable/background_countdown_normal_grey"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:scrollbars="none" >
<TextView
android:id="@+id/textview_countdown_digit1"
style="@style/TextView.CountdownDigit"
android:text="0\n9" />
</ScrollView>
我使用ObjectAnimator
属性scrollY
进行动画制作。到目前为止运作良好。
我也尝试过2 TextViews
intsead of one(在我的初始布局中),但它没有改变裁剪的事实。