ObjectAnimateur animé LinearLayout largeur

D'accord, alors j'ai vérifié http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html

Il dit que vous pouvez animer la propriété d'un objet dans un temps donné. Et j'ai essayé de bouger les objets et ça a l'air bien. J'ai rencontré un problème lorsque j'ai changé la largeur d'un LinearLayout. J'ai compris ceci:

  • Dessiner 2 cercles sur un canevas
  • Comment configurer la police de police personnalisée vers le texte Spinner par programme?
  • Comment lire le numéro d'identification de la carte SD?
  • Communication entre BroadcastReceiver et Activity - Android
  • Fragment Android surRestoreInstanceState
  • Dialogs / AlertDialogs: Comment "bloquer l'exécution" alors que la boîte de dialogue est activée (style .NET)
  • 10-26 14:51:27.190: E/PropertyValuesHolder(12681): Couldn't find setter/getter for property width with value type float 

    Ensuite, j'ai essayé d'étendre LinearLayout, avec "myWidth"

     public void setMyWidth(int myWidth) { LinearLayout.LayoutParams params = (LayoutParams) getLayoutParams(); params.weight = myWidth; setLayoutParams(params); requestLayout(); this.myWidth = myWidth; } 

    Pas de chance. Ensuite, j'ai essayé de changer LayoutParams.width, la largeur et la hauteur sont les seules propriétés publiques dans java history, et ObjectAnimator a besoin de getter et setter. Pas de chance. Je suis embarrassé de dire que j'ai essayé d'étendre LayoutParams aussi … sans chance ofc.

    Quelqu'un a réussi à faire une telle chose? J'ai utilisé le vieux android.view.animation et j'ai eu ce que je voulais, mais je suis curieux pour l'avenir.

    5 Solutions collect form web for “ObjectAnimateur animé LinearLayout largeur”

    Dans les situations où il n'y a pas de getter / setter de propriété simple, vous devez utiliser ValueAnimator et effectuer l'animation manuellement.

    En supposant:

    • V est la vue que vous animez
    • END_WIDTH est la largeur cible de la vue en pixels.
    • DUARTION est la longueur souhaitée de l'animation en millisecondes.

    Votre code devrait ressembler à ceci:

      ValueAnimator anim = ValueAnimator.ofInt(v.getMeasuredWidth(), END_WIDTH); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); layoutParams.width = val; v.setLayoutParams(layoutParams); } }); anim.setDuration(DURATION); anim.start(); 

    Pour ce qu'il vaut la peine, cela fonctionne. Après avoir modifié la largeur sur les paramètres de mise en page, vous devez réinitialiser l'objet params de mise en page.

     private class WidthEvaluator extends IntEvaluator { private View v; public WidthEvaluator(View v) { this.v = v; } @Override public Object evaluate(float fraction, Object startValue, Object endValue) { int num = (Integer)super.evaluate(fraction, startValue, endValue); ViewGroup.LayoutParams params = v.getLayoutParams(); params.width = num; v.setLayoutParams(params); return num; } } // your client code ValueAnimator.ofObject(new WidthEvaluator(box), box.getWidth(), v.getWidth()).start(); 

    Vous avez fait une erreur

      params.weight = myWidth; 

    Je pense que c'est params.width pas params.weight

    J'ai créé une petite bibliothèque ViewPropertyObjectAnimator qui peut le faire de manière très simple (et utilise une approche similaire à celle proposée par Tomer Weller ).

    Vous pouvez réaliser cette animation avec (en supposant que mLinearLayout est la View animée et mEndWidth est la valeur finale de la largeur de la View's ):

     ViewPropertyObjectAnimator.animate(mLinearLayout).width(mEndWidth).start(); 

    Je pense qu'une meilleure façon d'y parvenir serait d'utiliser la propriété scaleX et scaleY de View qui sont définis complètement dans la classe View, donc il serait valable avec pratiquement n'importe quelle vue ou mise en page.

    Par exemple, considérez ceci

     ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(MyLinearLayout,"ScaleX",0,1); objectAnimator.setDuration(300); objectAnimator.start(); 

    Ça marche.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.