将布局设置为另一个布局底部的动画,其距离在运行时确定

时间:2013-05-03 06:42:53

标签: android animation translation

我有两个FrameLayout s彼此重叠(我们称之为layout_frontlayout_back,其中每个布局都有多个文字和图片视图)。最初layout_back的可见性已设置为已消失。

我想要实现的目标:当我希望显示layout_back时,我将其设置为可见,并且我想要将layout_front设置为动画以向下滑动到layout_back的底部。效果就像我有两张“卡片”,向下滑动前卡以显示后面的另一张卡片。

问题:第一个明显的方法是为layout_front创建一个动画xml,如下所示:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:duration="400"
    android:fillAfter="true"
    android:fromYDelta="0%"
    android:toYDelta="100%" />
</set>

1)我的第一个问题是,layout_front在动画后不会停留在那里,但会在翻译后立即弹回原来的位置。我应该怎么做才能让它在滑下后保持

2)我的第二个问题更严重。 layout_front滑动的距离(layout_back的高度)直到运行时才确定。有没有办法动态设置YDelta值?

1 个答案:

答案 0 :(得分:0)

我自己回答这个问题。布局看起来像这样:

    <RelativeLayout
        android:id="@+id/pair_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <FrameLayout
            android:id="@id/layout_back"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/list_background"
            android:visibility="gone" >

            <TextView
                android:id="@id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"/>
        </FrameLayout>

        <FrameLayout
            android:id="@id/layout_front"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/background">

            <Button
                android:id="@id/button_blue"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" >
            </Button>
        </FrameLayout>
    </RelativeLayout>

后面的布局由textview组成,而前面的布局是一个按钮。单击该按钮时,它将滑动到textview的底部。按钮侦听器的实现方式如下:

public class ButtonListener implements OnClickListener {
    final FrameLayout l_front;
    final FrameLayout l_back;

    public blueListener(FrameLayout f, FrameLayout b) {
        this.l_back = b;
        this.l_front = f;
    }

    @Override
    public void onClick(View v) {

        l_back.setVisibility(View.VISIBLE);
        l_back.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        l_front.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

        TranslateAnimation tanim = new TranslateAnimation(
                TranslateAnimation.ABSOLUTE, 0.0f,
                TranslateAnimation.ABSOLUTE, 0.0f,
                TranslateAnimation.ABSOLUTE, 0.0f,
                TranslateAnimation.ABSOLUTE, l_back.getMeasuredHeight());
        tanim.setDuration(400);
        tanim.setFillAfter(true);
        tanim.setInterpolator(new DecelerateInterpolator());
        l_front.setAnimation(tanim);
        ((RelativeLayout)l_front.getParent()).getLayoutParams().height
        = l_back.getMeasuredHeight() + l_front.getMeasuredHeight();
    }
}