Tengo dos vistas en un diseño lineal, programáticamente cambio su propiedad layout_weight. ¿Hay alguna manera de animar este cambio de peso para que, cuando se cambie de peso, las vistas se deslicen hacia un nuevo tamaño?De todas maneras para animar programáticamente la propiedad del peso del diseño del diseño lineal
Respuesta
He estado mirando esto también. Eventualmente lo resolví animando la propiedad weightsum del padre, que funciona muy bien si tienes dos vistas en LinearLayout.
ver: Animating weightSum property using ObjectAnimator
En el siguiente ejemplo, si se anima la weightSum de 1,0 a 2,0, de la pantalla 2 se animará muy bien a la vista.
<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>
Simplemente puede usar ObjectAnimator.
ObjectAnimator anim = ObjectAnimator.ofFloat(
viewToAnimate,
"weight",
startValue,
endValue);
anim.setDuration(2500);
anim.start();
El único problema es que la clase View tiene ningún método setWeight() (que es requerido por ObjectAnimator). Para resolver esto, escribí un contenedor simple que ayuda a visualizar la animación de peso del archivo.
public class ViewWeightAnimationWrapper {
private View view;
public ViewWeightAnimationWrapper(View view) {
if (view.getLayoutParams() instanceof LinearLayout.LayoutParams) {
this.view = view;
} else {
throw new IllegalArgumentException("The view should have LinearLayout as parent");
}
}
public void setWeight(float weight) {
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.weight = weight;
view.getParent().requestLayout();
}
public float getWeight() {
return ((LinearLayout.LayoutParams) view.getLayoutParams()).weight;
}
}
utilizarlo en esta forma:
ViewWeightAnimationWrapper animationWrapper = new ViewWeightAnimationWrapper(view);
ObjectAnimator anim = ObjectAnimator.ofFloat(animationWrapper,
"weight",
animationWrapper.getWeight(),
weight);
anim.setDuration(2500);
anim.start();
Otra forma es utilizar la vieja clase Animation
, como se describe en https://stackoverflow.com/a/20334557/2914140. En este caso, puede cambiar simultáneamente los pesos de varias Vistas.
private static class ExpandAnimation extends Animation {
private final View[] views;
private final float startWeight;
private final float deltaWeight;
ExpandAnimation(View[] views, float startWeight, float endWeight) {
this.views = views;
this.startWeight = startWeight;
this.deltaWeight = endWeight - startWeight;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
float weight = startWeight + (deltaWeight * interpolatedTime);
for (View view : views) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) view.getLayoutParams();
lp.weight = weight;
view.setLayoutParams(lp);
}
views[0].getParent().requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
}
Nota: No estoy seguro de que esta es la mejor manera, pero lo probé y está funcionando muy bien
Simplemente usando ValueAnimator
ValueAnimator m1 = ValueAnimator.ofFloat(0.2f, 0.5f); //fromWeight, toWeight
m1.setDuration(400);
m1.setStartDelay(100); //Optional Delay
m1.setInterpolator(new LinearInterpolator());
m1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
((LinearLayout.LayoutParams) viewToAnimate.getLayoutParams()).weight = (float) animation.getAnimatedValue();
viewToAnimate.requestLayout();
}
});
m1.start();
- 1. peso anidado en diseño lineal
- 2. android: cómo eliminar la vista del diseño lineal
- 3. la característica "incluir" del diseño no admite la propiedad layout_gravity?
- 4. diseño dentro del diseño en R
- 5. desventajas del patrón de diseño del generador
- 6. Diseño del código LINQ
- 7. .NET Diseño del proyecto del marco de la entidad (arquitectura)
- 8. Localización del diseño del teclado en pantalla
- 9. Establecer alfa/opacidad del diseño
- 10. Frustraciones del patrón de diseño
- 11. Diseño del formulario usando CSS
- 12. Cambio del diseño de widgets mediante programación
- 13. ¡Anulación del diseño de Magento!
- 14. ¿Cómo luchas contra la complejidad del diseño?
- 15. Uso del diseño de ScrollViews en HorizontalScrollView
- 16. Orchard - Obtener el título del contenido del diseño del tema
- 17. Android: Agregue una vista textual al diseño lineal programáticamente
- 18. android peso de diseño mediante programación
- 19. ANTI_ALIAS_FLAG para ImageView dentro del diseño?
- 20. Posicionar imágenes fuera del diseño
- 21. Uso del diseño con knitr
- 22. Qt obtener hijos del diseño
- 23. La vista parcial hereda del diseño principal
- 24. Qt - diseño correcto del código de aplicación
- 25. Diseño del título del cuadro de diálogo anterior en Android
- 26. SOA - Diseño del servicio de autenticación
- 27. Diseño del compilador y clase de construcción
- 28. Uso del analizador de diseño de Trifecta
- 29. Unidad de trabajo de diseño del patrón
- 30. ¿Cómo agregar borde alrededor del diseño lineal, excepto en la parte inferior?
Este enfoque tiene una limitación: no se puede animar muy bien la primera pantalla para 0 peso. Necesitarías un gran pesoSum para hacer eso pero luego la animación será más rápida. – headsvk
¿Alguna manera de hacer esto al revés? animar la vista izquierda desapareciendo y reapareciendo? –