我设置了一个简单的活动来试图解决这个问题。 我有一个FrameLayout,我在其中启用了#34; AnimateLayoutchanges"。 我有一个按钮,可以更改TextView的布局边距和宽度。 如果这是唯一的布局更改,则边距和宽度的更改将不会生成动画。但是,如果我简单地设置可见性,如果另一个子帧具有相同的FrameLayout,则可见性更改和边距/宽度更改都将设置动画。
旁注:可见性和边距+宽度变化将按顺序发生,而不是同时发生,有没有办法改变这种行为?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#888"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".activities.TestActivity">
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/PivotTheme" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="buttonHandler"
android:text="test button 1" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="@color/white">
<TextView
android:id="@+id/testTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/purple_gradient_end"
android:text="TestView" />
<TextView
android:id="@+id/testTv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@color/purple_gradient_end"
android:text="TestView" />
</FrameLayout>
</LinearLayout>
的活动:
public void buttonHandler(View view){
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) testTv.getLayoutParams();
if(testDown) {
params.setMargins(100, 400, 0, 0);
params.width = 400;
testTv2.setVisibility(View.GONE);// if I comment out this line, nothing will animate
testDown = false;
} else {
params.setMargins(0, 0, 0, 0);
params.width = 100;
testTv2.setVisibility(View.VISIBLE);
testDown = true;
}
testTv.setLayoutParams(params);
}
我觉得这是android的一个错误,其中边距或宽度的变化无法设置触发动画的标志,但如果通过更改可见性设置此标志,则所有动画都会得到正确处理。
答案 0 :(得分:0)
对于这种类型的更改(如更改参数),您还需要启用“更改”(animateLayoutChange必须为true)
val frmMain=findViewById<FrameLayout>(R.id.frmMain)
val currentTransitions=frmMain.layoutTransition
currentTransitions.enableTransitionType(LayoutTransition.CHANGING)
frmMain.layoutTransition=currentTransitions