我想在出现新片段时隐藏片段。
我正在构建关于GitHub上的ScienceGuy代码,在Fragment Animation like Gmail Honeycomb App上引用
我从三个片段开始。最左侧的重量为6,中间的重量为4,最右侧的重量为4.将weightSum设置为10会使左侧和中间的碎片出现,最右侧的位置为屏幕外。这就是我想要的。
当用户选择中间片段中的项目时,我想转换左片段,使其中三分之二移出屏幕左侧。由于权重,我实际上会有2,4,4。此时,正确的片段已完全移动到屏幕上。
使用ScienceGuy的代码,我可以在左片段滚动时显示正确的片段,但左片段完全消失。
我尝试使用以下代码:
final float middleFragmentWidth = getMiddleFragment().getView().getWidth();
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "x",
-middleFragmentWidth/2, 0).setDuration(
trans.getDuration(LayoutTransition.APPEARING));
trans.setAnimator(LayoutTransition.APPEARING, animIn);
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "x", -middleFragmentWidth,
-middleFragmentWidth/2).setDuration(
trans.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
trans.setAnimator(LayoutTransition.DISAPPEARING, animOut);
我怀疑Android会在一个“隐藏”它时完全隐藏片段。有没有办法让片段动画,以便它们实际上不被隐藏,但部分在屏幕外?
或者,我可以将三个片段放入HorizontalScrollView,并尝试设置动画。但是,我没有这样做,因为中间和最右边的片段包含listview,并且要避免在HorizontalScrollView中使用listview according to the docs。
答案 0 :(得分:3)
我最终创建了一个基于LinearLayout的自定义视图,该视图是设备宽度的150%。
public class AutoSizingLinearLayout extends LinearLayout {
private static final String TAG = AutoSizingLinearLayout.class.getSimpleName();
final int myWidth;
public AutoSizingLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
myWidth = setScaledWidth(context);
}
public AutoSizingLinearLayout(Context context) {
super(context);
myWidth = setScaledWidth(context);
}
private int setScaledWidth(Context context) {
if (this.isInEditMode()){
return 1000;
} else {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
return (int) (1.5 * wm.getDefaultDisplay().getWidth());
}
}
@Override
public android.view.ViewGroup.LayoutParams getLayoutParams() {
android.view.ViewGroup.LayoutParams params = super.getLayoutParams();
params.width = myWidth;
return params;
}
然后我像这样动画它。
ObjectAnimator a = ObjectAnimator.ofFloat(linearView,"translationX", -scrollamount).setDuration(900);
a.start();