2012-05-07 8 views
2

新しいフラグメントが現れたときにフラグメントを部分的に隠したい。フラグメントが部分的にオフスクリーンになるようにアニメートする

Fragment Animation like Gmail Honeycomb App

に参照されるように、私は3つのフラグメントで始まり、GitHubの上ScienceGuyのコードの上に構築しています。最も左のものは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が1がそれを「隠す」ときの断片が完全に隠されていることを期待していることを疑います。フラグメントをアニメーション化して、実際に隠されていないが部分的にオフスクリーンになる方法はありますか?

また、3つのフラグメントをHorizo​​ntalScrollViewに配置し、それをアニメーション化することもできます。しかし、中と右端のフラグメントにはリストビューが含まれているため、Horizo​​ntalScrollView内のリストビューを使用することは避けてください。according to the docs

+0

こんにちは、私は同じ問題に直面しています。これを解決してもらえますか? – Dhaval

+0

LinearLayoutに基づくカスタムビューの作成が終了しました。私は例を挙げて質問に答えます。 –

答えて

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(); 
関連する問題