Ion*_*gru 5 android android-animation android-linearlayout layouttransition
我正在尝试为LinearLayout高度设置为的视图的添加/删除操作设置动画wrap_content。
目前我已经尝试设置android:animateLayoutChanges="true"LinearLayout 并以编程方式启用这样的转换:
LayoutTransition transition = new LayoutTransition();
transition.setDuration(300);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
transition.enableTransitionType(LayoutTransition.APPEARING);
transition.enableTransitionType(LayoutTransition.DISAPPEARING);
transition.setAnimateParentHierarchy(true);
}
container.setLayoutTransition(transition);
Run Code Online (Sandbox Code Playgroud)
Appearing 似乎工作得非常流畅,并且可以根据需要设置动画和调整大小。
我遇到的问题是消失,因为LinearLayout在移除动画完成之前调整了容器的大小。
我也试过玩弄setAnimateParentHierarchy(),它似乎并没有真正影响容器调整大小的方式和时间。
一个简单的解决方案是将布局过渡设置为不使用wrap_content 的第一个祖先。
以下代码找到正确的祖先,设置所需的动画并在动画结束时恢复原始的 LayoutTransition (如果存在)。
在执行添加/删除操作的代码中调用此方法。问题中包含的任何代码都不是必需的。
注意:此解决方案仅适用于 SDK >= JELLY_BEAN。
private static void setHeightChangeAnimation(ViewGroup animatedLayout) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
ViewGroup vg = animatedLayout;
while (vg instanceof ViewGroup) {
vg = (ViewGroup) vg.getParent();
if (vg instanceof ViewGroup && vg.getLayoutParams().height != LayoutParams.WRAP_CONTENT) {
LayoutTransition animatedLayoutLt = animatedLayout.getLayoutTransition();
LayoutTransition lt = new LayoutTransition();
lt.enableTransitionType(LayoutTransition.CHANGING);
lt.setDuration(animatedLayoutLt.getDuration(LayoutTransition.CHANGE_APPEARING));
lt.setStartDelay(LayoutTransition.CHANGING, animatedLayoutLt.getStartDelay(LayoutTransition.APPEARING));
final ViewGroup finalVg = vg;
final LayoutTransition oldLt = finalVg.getLayoutTransition();
lt.addTransitionListener(new LayoutTransition.TransitionListener() {
public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {}
public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
finalVg.setLayoutTransition(oldLt);
}
});
finalVg.setLayoutTransition(lt);
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并用它来调用:
Run Code Online (Sandbox Code Playgroud)setHeightChangeAnimation(yourAnimatedLinearLayout);
| 归档时间: |
|
| 查看次数: |
1261 次 |
| 最近记录: |