为片段设置动画,使其部分在屏幕外

时间:2012-05-07 02:06:40

标签: android android-fragments android-animation

我想在出现新片段时隐藏片段。

我正在构建关于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会在一个“隐藏”它时完全隐藏片段。有没有办法让片段动画,以便它们实际上不被隐藏,但部分在屏幕外?

或者,我可以将三个片段放入Horizo​​ntalScrollView,并尝试设置动画。但是,我没有这样做,因为中间和最右边的片段包含listview,并且要避免在Horizo​​ntalScrollView中使用listview according to the docs

1 个答案:

答案 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();