2

新しいフラグメントが表示されたときに、フラグメントを部分的に非表示にしたいと考えています。

Gmail Honeycomb App のような Fragment Animationで参照されているように、GitHub の ScienceGuy のコードに基づいて構築しています。

3 つのフラグメントから始めます。左端の重みは 6、中央の重みは 4、右端の重みは 4 です。weightSum を 10 に設定すると、左と中央のフラグメントが表示され、右端は画面外になります。これが私が欲しいものです。

ユーザーが中央のフラグメントのアイテムを選択すると、左のフラグメントを遷移させて、その 3 分の 2 が画面の左側からはみ出すようにします。重みがあるので、実質的には 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 が想定していると思われます。フラグメントをアニメーション化して、実際には非表示にせず、部分的に画面外に表示する方法はありますか?

または、3 つのフラグメントを Horizo​​ntalScrollView に入れ、それをアニメーション化することもできます。ただし、中央と右のほとんどのフラグメントにはリストビューが含まれており、ドキュメントに従って、Horizo​​ntalScrollView 内でリストビューを使用することは避けるべきであるため、私はそれを行っていません。

4

1 に答える 1

3

デバイスの幅の 150% である LinearLayout に基づいてカスタム ビューを作成しました。

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();
于 2012-07-30T00:52:16.190 に答える