在另一个视图setVisibility(GONE)之后将视图设置为新位置

时间:2012-06-28 14:47:19

标签: android android-animation

我想在布局中显示3 Views,但一次只能显示2 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="3" > <FrameLayout android:id="@+id/stations_stations" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="20dp" android:layout_weight="1" android:background="@drawable/fragment_border" /> <FrameLayout android:id="@+id/stations_singlestation" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="20dp" android:layout_weight="2" android:background="@drawable/fragment_border" /> <FrameLayout android:id="@+id/stations_trip" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="20dp" android:layout_weight="1" android:background="@drawable/fragment_border" android:visibility="gone" /> </LinearLayout> 。当我按下一个按钮时,我希望最左边的视图向左滑出,中间的一个用它滑动,取左边视图的起始空间,最右边的视图应该滑入屏幕。

以下是一些截图:

动画前:
enter image description here

动画期间(绘画编辑^^): enter image description here

动画后: enter image description here

这是我的布局文件:

    final View stationsContainer = findViewById(R.id.stations_stations);
    Animation an = AnimationUtils.loadAnimation(this, R.anim.slide_out_left);
    stationsContainer.startAnimation(an);
    an.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            stationsContainer.setVisibility(View.GONE);
        }
    });

因此,我可以使用以下代码为屏幕上的最左侧视图设置动画:

{{1}}

这会将窗口左侧的最左侧视图设置为动画,并将其设置为已消失。我还可以将中间视图设置为新位置的动画,但是当动画完成后,中间视图会在很短的时间内跳回到原始位置,之后它会采取正确的位置。我怎么能避免这种跳跃?

4 个答案:

答案 0 :(得分:3)

  • VISIBLEGONE之间的观看次数发生变化时,使用LayoutTransistion课程可自动为子视图设置动画。此课程可从API 11开始提供。

    有关示例代码,请查看sdk附带的示例。确切路径为ApiDemos\src\com\example\android\apis\animation\LayoutAnimationsHideShow.java

  • 使用LayoutAnimationController类在视图添加到视图组或从视图组中删除视图时为其设置动画。在这里,您必须保留对已删除视图的引用,因为您希望稍后再次添加它。此类适用于所有版本的Android。

    示例代码路径:ApiDemos\src\com\example\android\apis\view\LayoutAnimation

答案 1 :(得分:0)

使用animation滑入和滑出。您需要在资源中将动画定义为xml。

See this for example

或者您可以使用ViewFlipper Try this as an example

在SO和网络上有更多的例子。

答案 2 :(得分:0)

将FrameLayouts添加到ViewFlipper中。 e.g。

<ViewFlipper>
 <FrameLayout1/>
 <FrameLayout2/>
 <FrameLayout3/>
</ViewFlipper>

然后在您的代码中调用setInAnimation(leftInAnim)和setOutAnimation(leftOutAnim)到viewFlipper,并调用showNext(),这将导致动画应用于当前视图和下一个视图。

leftInAnim和leftOutAnim是一个XML动画资源,它告诉系统如何动画当前视图:例如。

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

这将导致视图从右侧(视图外)滑入当前视图

答案 3 :(得分:-1)

只需将android:animateLayoutChanges=true添加到包含所有观看次数的LinearLayout,即可获得所需的结果