让Android在动画时不剪辑视图(简单的类似翻转时的小部件)

时间:2013-08-06 16:14:28

标签: android view android-animation clipping

我正在实现一个简单的翻转时钟/计数器/自动收报机小部件,它将包含以下“数字”小部件的多个实例:

enter image description here

这是一个放在背景图像上方的数字。该数字应该通过向上滑动并显示下一个数字来动画每秒。在动画期间,两个数字都应该保持在背景边界内。

我试图通过让TextView包含2行 - 每行一位数 - 并向上调整此TextView的位置来实现此行为,直到下一个数字完全可见。然后我将重置TextView的位置并同时替换两个数字,这样就无法注意到了。然后我将重复这个过程,让它看起来像动画永远不会结束。

在这里你可以看到动画的中间状态,当部分零和九部分可见时。我通过将layout_marginTop属性设置为负值,在Eclipse的Graphical Layout编辑器中“嘲笑”它。

enter image description here

这是布局文件(提到的属性通常不存在)。

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

我尝试了两种解决方案。通过在ViewPropertyAnimatortranslateY上使用y,我得到了一个平滑的动画,但TextView的原始剪辑在动画期间不会改变,因此实际上是第二个数字永远不可见。正如您所看到的,我尝试了clipChildren属性,但它似乎没有改变任何东西。

我的第二种方法是将ValueAnimator与自定义Evaluator一起使用,这会修改topMarginLayoutParams的{​​{1}}。它很有效,但即使在高端设备上,动画也非常不稳定。

所以我的问题是,如何避免动画期间的视图剪辑并以有效的方式制作?有更好的方法吗?

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(在我的初始布局中),但它没有改变裁剪的事实。