J'utilise ObjectAnimator pour réduire un RelativeLayout:
ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
scaleDownY.setDuration(1000);
AnimatorSet scaleDown = new AnimatorSet();
scaleDown.play(scaleDownX).with(scaleDownY);
scaleDown.start();
Il se réduit assez bien comme prévu, mais le problème est que la zone autour de la vue la plus petite est noire jusqu'à ce qu'une autre action soit effectuée, ce qui n'est pas souhaitable. Je veux qu'il corresponde à l'arrière-plan du parent de la vue mise à l'échelle. Avez-vous une idée de la manière dont la zone autour du carré rouge doit immédiatement avoir la bonne couleur?
Mon xml:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:gui="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/bg"
Android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity$DummySectionFragment">
<RelativeLayout
Android:id="@+id/res1"
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:tag="res1"
Android:background="@Android:color/holo_red_dark"
Android:layout_alignTop="@+id/res2"
Android:layout_alignRight="@+id/include3"
Android:layout_marginRight="11dp">
<TextView
Android:layout_marginLeft="15dp"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="res1"
Android:id="@+id/res1T"
Android:layout_centerVertical="true"
Android:layout_centerHorizontal="true"/>
</RelativeLayout>
</RelativeLayout>
Ce n'est peut-être pas la solution la plus propre, mais l'ajout d'un écouteur de mise à jour d'animation et l'invalidation du parent pourraient faire le travail.
ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
scaleDownX.setDuration(1000);
scaleDownY.setDuration(1000);
AnimatorSet scaleDown = new AnimatorSet();
scaleDown.play(scaleDownX).with(scaleDownY);
scaleDownX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
View p= (View) v.getParent();
p.invalidate();
});
scaleDown.start();
La raison pour laquelle la réponse précédente doit invalider le parent est que votre animatorSet scaleDown n'a pas de cible. Vous devez définir la cible de votre ObjectAnimator sur null et définir la cible sur le AnimatorSet. Ou un meilleur moyen serait d'utiliser le code ci-dessous:
ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(view,
PropertyValuesHolder.ofFloat("scaleX", 0.5f),
PropertyValuesHolder.ofFloat("scaleY", 0.5f));
scaleDown.setDuration(1000);
scaleDown.start();
Comme indiqué dans les commentaires, l'approche pour créer un ObjectAnimator consiste à utiliser l'objet statique Propriété de la vue au lieu de transmettre la chaîne, car l'utilisation de la valeur de chaîne implique une réflexion pour le setter et éventuellement pour le getter afin de dériver la valeur de départ de l'attribut. Ceci est disponible à partir de API 14
ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, View.SCALE_X, 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.5f);
Une explication complète peut être trouvée dans DevBytes: Property Animations vidéo de l'ingénieur de Google, Chet Haase