2011-12-01 10 views
7

Intro:Animación de propiedad weightSum usando ObjectAnimator

Tengo un LinearLayout, que contiene dos LinearLayouts sub, así:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/dual_pane" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:weightSum="1.0"> 

    <!-- Screen 1 --> 
    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:background="#ff0000" 
     android:layout_weight="1"> 
    </LinearLayout> 

    <!-- Screen 2 --> 
    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:background="#ff6600" 
     android:layout_weight="1"> 
    </LinearLayout> 
</LinearLayout> 

Inicialmente, quiero "Screen 1" a tomar todas ancho de la pantalla disponible. Por lo tanto, mi R.id.dual_pane tiene su atributo weightSum a 1.0. Esto funciona bien! si weightSum = 1.0, ¡la pantalla 1 ocupa toda la pantalla!

Después de cargar algunos recursos, cambio mi R.id.dual_pane weighSum a 2.0, lo que da como resultado que tanto la Pantalla 1 como la Pantalla 2 obtengan un 50% de descuento en el ancho de la pantalla. Esto también funciona perfecto. Cuando weightSum = 2.0, ambas pantallas toman el 50% del ancho.

Problema:.

me gustaría animar la propiedad weightSum, por lo que mi Screen2 se deslizará en me estoy apuntando HoneyComb, por lo que la versión minSDK es de 11, y pensé, utilizando el nuevo marco ObjectAnimator, Podría animar fácilmente esta propiedad, para obtener un buen efecto suave. Verifiqué que LinearLayout tiene métodos getWeightSum() y setWeightSum() (que se requiere para usar ObjectAnimator, creo).

propio esfuerzo:

Aquí está mi código para mostrar y ocultar Screen2 utilizando el ObjectAnimator:

private void showScreen2() 
{ 
    //Not-animated will work... 
    //mDualPane.setWeightSum(2.0f); 

    // Now try to animate the weightSum 
    float ws = mDualPane.getWeightSum(); 
    ObjectAnimator anim = ObjectAnimator.ofFloat(mDualPane, "weightSum", ws, 2.0f); 
    anim.setDuration(5000); 
    anim.start(); 
} 

private void hideScreen2() 
{ 
    //Not-animated will work... 
    //mDualPane.setWeightSum(1.0f); 

    // Now try to animate the weightSum 
    float ws = mDualPane.getWeightSum(); 
    ObjectAnimator anim = ObjectAnimator.ofFloat(mDualPane, "weightSum", ws, 1.0f); 
    anim.setDuration(5000); 
    anim.start(); 
} 

Aquí, mi mDualPane es mi raíz LinearLayout ...

Pregunta:

Cuando llamo a estas funciones, nada h aparece. La pantalla permanece exactamente como estaba antes. ¿Debo llamar a requestLayout() en mi mDualPane en alguna parte? ¿Me falta algún conocimiento del ObjectAnimator? ¿O es imposible animar la propiedad weightSum?

también:

1) que no quieren meterse con anchuras no modificables, y animar a aquellos. Por ahora quiero 50-50 para ambas pantallas, pero podría cambiarlo más tarde. De todos modos, necesito poder establecer una relación específica entre los dos anchos.

2) He mirado LayoutTransition combinado con cambiar la visibilidad, pero fue en vano

Respuesta

11

yo estaba justo en el sentido de que es necesario que actualice la disposición a mí mismo:

float ws = mDualPane.getWeightSum(); 
ObjectAnimator anim = ObjectAnimator.ofFloat(mDualPane, "weightSum", ws, 2.0f); 
anim.setDuration(5000); 
anim.addUpdateListener(this); 
anim.start(); 

Ahora, añadí un UpdateListener a la ObjectAnimator, que se realiza mediante la actividad de mi y se actualiza el diseño:

@Override 
public void onAnimationUpdate(ValueAnimator animation) { 
    mDualPane.requestLayout(); 
} 

parece extraño para mí, que no llama ObjectAnimator esto mismo, pero de todos modos, así es cómo hacerlo funcionar.

La solución es especialmente agradable, en mi opinión, ya que puede animar muy bien los diseños deslizándose, independientemente del tamaño de pantalla ...

+0

hola, Entreco si dos diseños lineales tienen pesos desiguales entonces, ¿podemos hacer esto posible para mover el diseño del lado derecho al lado izquierdo y llenar toda la pantalla? por favor, ayuda – user1108995

+1

Desafortunadamente, esto solo funciona para vistas deslizantes de izquierda a derecha, debido a la naturaleza de LinearLayout. Para hacer esto al revés, sugiero que veas http://stackoverflow.com/questions/4932462/animate-the-transition-between-fragments – Entreco

+0

mis dos vistas también están en LinearLayout pero con pesos desiguales – user1108995

Cuestiones relacionadas