2012-12-07 3 views
1

Salut, je suis en train d'animer la hauteur d'une vue en android dire toutes les 5 secondes: -Animer la hauteur d'une vue android

  1. hauteur va de 0 à 5
  2. hauteur va de 5 à 10
  3. hauteur va 10-3 etc

J'utilise le code ci-dessous: -

public class ShowAnimation extends Animation{ 
    float finalHeight; 
    View imageview; 

    public ShowAnimation(View view,float deltaheight){ 
     this.imageview=view; 
     this.finalHeight=deltaheight; 
    } 

    protected void applyTransformation(float interpolatedtime,Transformation t){ 
     imageview.getLayoutParams().height=(int)(finalHeight*interpolatedtime); 
     imageview.requestLayout(); 
    } 
    @Override 
    public void initialize(int width, int height, int parentWidth, 
      int parentHeight) { 
     super.initialize(width, height, parentWidth, parentHeight); 
    } 

    @Override 
    public boolean willChangeBounds() { 
     return true; 
    } 
    } 

et l'initialiser comme ceci: -

Animation anidelta = new ShowAnimation(delta, deltaheight); 
anidelta.setDuration(500/* animation time */); 
delta.startAnimation(anidelta); 

Mais avec ce que je reçois le ci-dessous: -

  1. hauteur va de 0 à 5
  2. hauteur va de 0 à 10
  3. hauteur va de 0 à 3

Je veux que la hauteur soit animée de sa hauteur précédente plutôt que à partir de 0 à chaque fois. Quelqu'un peut-il s'il vous plaît me aider

Edit1: - Je l'ai fait

Animation anidelta = new ShowAnimation(delta, deltaheight); 
anidelta.setDuration(500/* animation time */); 
anidelta.setFillAfter(true); 
delta.startAnimation(anidelta); 

Mais il anime encore de 0 à la NewHeight.

+1

set animation.setFillAfter (true); Cela devrait résoudre le problème. –

+0

@ShreyaShah Je l'ai fait mais ça ne marche pas. S'il vous plaît voir mon edit – Rasmus

Répondre

-1

Essayez animation ensemble. Je ne suis pas sûr que ce soit ce que vous voulez.

Animation 1 pour: hauteur va de 0 à 5
Animation 2 pour: hauteur va de 0 à 10
animation 3 pour: hauteur va de 0 à 3

public void applyAnimation(ImageView ivDH) { 
    System.out.println("Inside applyAnimation()"); 
    scaleAnim1 = new ScaleAnimation(0, 5, 0, 5); 
    scaleAnim1.setDuration(5000); 
    scaleAnim1.setRepeatCount(0); 
    scaleAnim1.setInterpolator(new AccelerateDecelerateInterpolator()); 
    scaleAnim1.setFillAfter(true); 

    scaleAnim2 = new ScaleAnimation(-5, 10, -5, 10); 
    scaleAnim2.setDuration(5000); 
    scaleAnim2.setRepeatCount(0); 
    scaleAnim2.setInterpolator(new AccelerateDecelerateInterpolator()); 
    scaleAnim2.setFillAfter(true); 

    scaleAnim3 = new ScaleAnimation(10, 3, 10, 3); 
    scaleAnim3.setDuration(5000); 
    scaleAnim3.setRepeatCount(0); 
    scaleAnim3.setInterpolator(new AccelerateDecelerateInterpolator()); 
    scaleAnim3.setFillAfter(true); 

    AnimationSet animationSet = new AnimationSet(true); 
    animationSet.addAnimation(scaleAnim1); 
    animationSet.addAnimation(scaleAnim2); 
    animationSet.addAnimation(scaleAnim3); 
    animationSet.setDuration(15000); 
    animationSet.setFillAfter(true); 

    ivDH.clearAnimation(); 
    ivDH.startAnimation(animationSet); 
} 
0

Vous avez besoin d'un indicateur supplémentaire pour indiquer à votre méthode applyTransformation si vous souhaitez augmenter ou diminuer la hauteur de la vue.

Ajouter un drapeau au constructeur et enregistrer ce drapeau comme une variable d'instance, et d'utiliser ce drapeau pour décider d'augmenter ou de diminuer la hauteur de vue:

public class ShowAnimation { 
    // other instance variables 
    private boolean increaseHeight; 

    public ShowAnimation(View view, float deltaheight, boolean increaseHeight) { 
     // other initializations 
     this.increaseHeight = increaseHeight; 
    } 

    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     if (increaseHeight) 
      imageview.getLayoutParams().height = (int) (finalHeight * interpolatedTime); 
     else { 
      imageview.getLayoutParams().height = (int) (finalHeight * (1 - interpolatedTime)); 
     } 
     imageview.requestLayout(); 
    } 

} 
+0

Je ne pense pas que cela aiderait parce que même si j'utilise increaseHeight comme vrai, il s'anime toujours de 0 à la hauteur finale – Rasmus

+1

Ne pensez pas, essayez! – neevek

+0

@neevek comment réaliser cette animation http://www.dailymotion.com/video/x2qx2if – Erum

7

Ok donc voici comment J'ai finalement résolu ce: -

public class ResizeAnimation extends Animation 
{ 
    View view; 
int startH; 
int endH; 
int diff; 

public ResizeAnimation(View v, int newh) 
{ 
    view = v; 
    startH = v.getLayoutParams().height; 
    endH = newh; 
    diff = endH - startH; 
} 

@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) 
{ 
    view.getLayoutParams().height = startH + (int)(diff*interpolatedTime); 
    view.requestLayout(); 
} 

@Override 
public void initialize(int width, int height, int parentWidth, int parentHeight) 
{ 
    super.initialize(width, height, parentWidth, parentHeight); 
} 

@Override 
public boolean willChangeBounds() 
{ 
    return true; 
}} 
0

Je sais que ce poste n'a pas été actif depuis plus d'un an, mais je posterai ce que je pense est la meilleure façon d'animer la hauteur de vue de toute façon.

Au lieu de déclarer la classe d'animation, vous pouvez utiliser View.setScaleY API disponible à partir du niveau de l'API 11.

Avec cela, vous pouvez spécifier Situ dans la plage de 0-1 (0 signifie aucune hauteur et 1 signifie d'origine hauteur) dans la seconde désirée. En mode XML, définissez la hauteur de votre vue à sa hauteur maximale, puis en gonflant la vue (par ex.Activité dans onCreate() ou Fragment # onViewCreated()) vous pouvez

yourView.setScaleY(0); 

Puis au bout de 5 secondes, vous pouvez définir

yourView.setScaleY(0.5f); 

Cela échelle la hauteur de votre point de vue instantanément. Si vous voulez à l'échelle de la vue avec l'animation, vous pouvez par exemple faire quelque chose comme ceci:

yourView.animate().scaleY(0.5f).setDuration(200).start(); 

J'espère que ça aide.