2012-05-07 60 views
2

我想在出現新片段時部分隱藏片段。動畫片段,以便它部分偏離屏幕

我建立在ScienceGuy的GitHub上的代碼,在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中,並嘗試對它進行動畫處理。但是,我沒有這樣做,因爲大多數中間和最右邊的片段都包含listviews,並且要避免在Horizo​​ntalScrollView中使用listview according to the docs

+0

嗨,我面臨同樣的問題。你有解決這個問題嗎? – Dhaval

+0

我結束了基於LinearLayout的創建自定義視圖。我會用一個例子回答我的問題。 –

回答

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