我想在布局中显示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>
。当我按下一个按钮时,我希望最左边的视图向左滑出,中间的一个用它滑动,取左边视图的起始空间,最右边的视图应该滑入屏幕。
以下是一些截图:
动画前:
动画期间(绘画编辑^^):
动画后:
这是我的布局文件:
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}}
这会将窗口左侧的最左侧视图设置为动画,并将其设置为已消失。我还可以将中间视图设置为新位置的动画,但是当动画完成后,中间视图会在很短的时间内跳回到原始位置,之后它会采取正确的位置。我怎么能避免这种跳跃?
答案 0 :(得分:3)
当VISIBLE
和GONE
之间的观看次数发生变化时,使用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)
答案 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
,即可获得所需的结果