2012-06-19 17 views
6

Estoy intentando deslizar un fragmento en Android. La transición y el deslizamiento funcionan como se esperaba, se desliza exactamente donde yo quiero. Pero, antes de que la vista esté en su lugar, hay un fondo blanco donde la vista va a estar en su posición final. Es como si le hubieran asignado espacio. Pero quiero que se desplace sobre mis vistas actuales, por lo que no se muestra el fondo blanco. Alguna idea sobre esto? Estoy usando el animador de vista con el archivo xml en res/anim.Fondo blanco al animar fragmentos en android

Aquí es un poco de código:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

<translate 
    android:duration="100" 
    android:fromYDelta="100%" 
    android:toYDelta="0" /> 

<alpha 
    android:duration="100" 
    android:fromAlpha="0.0" 
    android:toAlpha="1.0" /> 

android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 

fragmentTransaction.setCustomAnimations(R.anim.slide_in_down, 0); 
fragmentTransaction.show(fragmentToSlideIn); 
fragmentTransaction.commit(); 

Así que, ¿por qué hay un fondo blanco en la posición final de la vista, antes de que haya alcanzado esa posición?

+0

u encontró solución para esto? incluso estoy enfrentando el mismo problema – Mohit

Respuesta

0

http://developer.android.com/guide/topics/graphics/prop-animation.html#object-animator Debe utilizar objectAnimator, aquí está el código de ejemplo que se desliza fragmento de derecha a izquierda:

private View mPanel1; 
    private View mPanel2; 
    private View mLayout; 
    boolean isCollapsed; 
    private int LayoutWidth; 
    private int Panel1Width; 
    private int Panel2Width; 
    private static final TimeInterpolator sCollapseInterpolator = new DecelerateInterpolator(2.5F); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mLayout = findViewById(R.id.linearlayout); 
    mPanel1 = findViewById(R.id.fragment1); 
    mPanel2 = findViewById(R.id.fragment2); 
} 
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
     // Measure width of layout and mPanel1 which is FragmentList. This is needed for ObjectAnimator 
     // to create transition animation 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     LayoutWidth = size.x; 
     Panel1Width = mPanel1.getWidth(); 
     Panel2Width = mPanel2.getWidth(); 

    } 
    public void slide(){ 
     if(isCollapsed){ 
         PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[2]; 
         arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("PanelLeft", Panel1Width * -1, 0); 
         arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", LayoutWidth, LayoutWidth - Panel1Width); 
         ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, arrayOfPropertyValuesHolder).setDuration(400); 
         localObjectAnimator.setInterpolator(sCollapseInterpolator); 
         localObjectAnimator.start(); 
        } 
        else{ 
         PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[2]; 
         arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("PanelLeft", 0, Panel1Width/-1); 
         arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", LayoutWidth - Panel1Width, LayoutWidth); 
         ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, arrayOfPropertyValuesHolder).setDuration(400); 
         localObjectAnimator.setInterpolator(sCollapseInterpolator); 
         localObjectAnimator.start(); 
        } 
        isCollapsed = !isCollapsed; 
    } 

     public int getPanelLeft() { 
      return ((ViewGroup.MarginLayoutParams) mLayout.getLayoutParams()).leftMargin; 
     } 

     public void setPanelLeft(int paramInt) { 
      ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mLayout.getLayoutParams(); 
      lp.leftMargin = paramInt; 
      mLayout.setLayoutParams(lp); 
     } 

     public int getPanel2W() { 
      return ((ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams()).width; 
     } 

     public void setPanel2W(int paramInt) { 
      ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams(); 
      lp.width = paramInt; 
      mPanel2.setLayoutParams(lp); 
     } 

Diseño:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/linearlayout" > 

    <fragment 
     android:id="@+id/fragment1" 
     android:name="package.your.fragment1" 
     android:layout_width="320dp" 
     android:layout_height="match_parent"/> 

<fragment 
     android:id="@+id/fragment2" 
     android:name="package.your.fragment2" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 
+1

Tenga en cuenta que [ObjectAnimator] (http://developer.android.com/reference/android/animation/ObjectAnimator.html) solo se agregó en ** API Level 11 **. – jenzz

+0

¿Encontró una solución para eso? Tengo el mismo problema con vistas normales. –

Cuestiones relacionadas