2010-08-12 8 views
1

Je souhaite animer une mise en page en touchant l'écran. Si vous touchez l'écran, les boutons de mise en page doivent être translatés hors de l'écran et de nouveau en touchant l'écran, la mise en page devrait apparaître dans l'écran à sa position d'origine.Android: traduire L'animation fonctionne pour la première fois et non la deuxième fois

Je rencontre le problème lorsque je le fais par programmation. et cela fonctionne quand je le fais par XML.

En programmation, cela fonctionne pour la première fois et ne fonctionne pas une deuxième fois. Même j'ai remarqué que si on clique sur l'écran on lit tout le code de démarrage de l'animation mais il ne s'anime pas mais après cela si on clique sur le bouton ajouté dans la mise en page, l'animation fonctionne.

Voici le code:

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.view.animation.LayoutAnimationController; 
import android.view.animation.Animation.AnimationListener; 
import android.webkit.WebView; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.RelativeLayout.LayoutParams; 

public class BrowserDemo2 extends Activity implements AnimationListener, OnTouchListener, OnClickListener 
{ 
    WebView browser; 
    RelativeLayout parentLayout; 
    LinearLayout navigationBarOuterLinearLayout; 
    FrameLayout navigationBarInnerFrameLayout; 

    Button galleryButton; 
    Button creditsButton; 
    Button viewChangeButton; 

    byte animationType; 
    public static final byte ANIM_IN = 0; 
    public static final byte ANIM_OUT = 1; 
    boolean isNavigationBarVisible = true; 
    boolean isAnimationInProgress; 


    @Override 
    public void onCreate(Bundle icicle) 
    { 
    super.onCreate(icicle);  
    setFullscreen(); 

    setContentView(R.layout.main); 
    parentLayout = (RelativeLayout) findViewById(R.id.parent); 

    setNavigationBarLayout(); 
    parentLayout.addView(navigationBarOuterLinearLayout); 

    animationType = ANIM_OUT; 
    animController = new LayoutAnimationController(this, null); 

    } 

    public void setNavigationBarLayout() 
    { 
    navigationBarOuterLinearLayout = new LinearLayout(this); 
    LayoutParams navigationBarOuterLinearLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    navigationBarOuterLinearLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    navigationBarOuterLinearLayout.setLayoutParams(navigationBarOuterLinearLayoutParams); 
    navigationBarOuterLinearLayout.setOrientation(LinearLayout.VERTICAL); 

    navigationBarInnerFrameLayout = new FrameLayout(this); 
    LayoutParams navigationBarInnerFrameLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    navigationBarInnerFrameLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    navigationBarInnerFrameLayout.setLayoutParams(navigationBarInnerFrameLayoutParams); 
    navigationBarInnerFrameLayout.setBackgroundResource(R.drawable.uitabbar); 
    navigationBarInnerFrameLayout.setPadding(0, 5, 0, 0); 

    galleryButton = new Button(this); 
    galleryButton.setOnClickListener(this); 
    galleryButton.setText("Gallery"); 
    FrameLayout.LayoutParams galleryButtonParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.LEFT); 
    galleryButton.setLayoutParams(galleryButtonParams); 

    creditsButton = new Button(this); 
    creditsButton.setOnClickListener(this); 
    creditsButton.setText("Credits"); 
    FrameLayout.LayoutParams creditsButtonParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); 
    creditsButton.setLayoutParams(creditsButtonParams); 

    viewChangeButton = new Button(this); 
    viewChangeButton.setOnClickListener(this); 
    viewChangeButton.setText("Chnage View"); 
    FrameLayout.LayoutParams viewChangeButtonParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT); 
    viewChangeButton.setLayoutParams(viewChangeButtonParams); 

    navigationBarInnerFrameLayout.addView(galleryButton); 
    navigationBarInnerFrameLayout.addView(creditsButton); 
    navigationBarInnerFrameLayout.addView(viewChangeButton); 

    navigationBarOuterLinearLayout.addView(navigationBarInnerFrameLayout); 
    } 

    public void setFullscreen() 
    { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    }  

    public void setAnimations() 
    { 
    switch(animationType) 
    { 
     case ANIM_IN: 
     { 
     isAnimationInProgress = true; 
     navigationBarOuterLinearLayout.setVisibility(View.VISIBLE);  
     animateLayout(R.anim.lower_navigation_bar_in, navigationBarOuterLinearLayout); 
//  parentLayout.requestFocus(); 
//  parentLayout.requestFocusFromTouch(); 
//  parentLayout.requestLayout(); 
     break; 
     } 
     case ANIM_OUT: 
     { 
     isAnimationInProgress = true; 
     animateLayout(R.anim.lower_navigation_bar_out, navigationBarOuterLinearLayout); 
     break; 
     } 
    } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
    if(event.getAction() == MotionEvent.ACTION_UP) 
    { 
     Log.v("onTouch", "in touch realease.."); 
     setAnimations(); 
    } 
    return true;  
    } 



    Animation layoutAnimation; 
    LayoutAnimationController animController; 
    public void animateLayout(int type, LinearLayout layout) 
    { 
    layoutAnimation = AnimationUtils.loadAnimation(this, type); 
    layoutAnimation.setAnimationListener(this); 
    animController.setAnimation(layoutAnimation); 
    layout.setLayoutAnimation(animController); 
    layout.startLayoutAnimation(); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) 
    { 
    if(animationType == ANIM_OUT && isNavigationBarVisible) 
    { 
     animationType = ANIM_IN; 
     isNavigationBarVisible = false; 
     navigationBarOuterLinearLayout.setVisibility(View.INVISIBLE); 
    } 
    else 
    { 
     animationType = ANIM_OUT; 
     isNavigationBarVisible = true;  
    } 
    isAnimationInProgress = false; 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public void onAnimationStart(Animation animation) 
    { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
    return false; 
    } 

    @Override 
    public void onClick(View v) 
    { 
    // TODO Auto-generated method stub 
    } 

Répondre

1

je me débattais avec un problème très similaire pour plus d'heures que je voudrais admettre. J'ai eu deux vues que je bougeais et que je fondais ensemble. Aller-retour en fonction de l'état. Une direction fonctionnait mais pas l'autre. L'un a été activé par une action au clavier et l'autre par une pression sur un bouton. Parce que l'un était une entrée de texte, je suis allé avec View.GONE pour définir la visibilité. Je pense que c'était là que le problème était. Je crois que la vue n'était pas réglée à View.VISIBLE jusqu'à ce que l'animation soit terminée (à ce moment-là, j'ai fait View.GONE de toute façon). Je ne peux pas vérifier cela, mais quand j'ai supprimé tous les appels setVisibility() et fait des changements d'alpha pure, les choses ont commencé à travailler pour moi. Je devrais également noter que je n'ai pas utilisé quelque chose comme setFillAfter(), mais calculé les positions moi-même parce que seule la partie dessinée sur la vue se déplaçait avec cela, pas la zone actionable (cliquable).

+0

J'ai également supprimé View.GONE de mon code. Malgré cela maintenant, je change grammaticalement la hauteur de la mise en page après l'avoir rendue INVISIBLE. Et son fonctionnement bien. Merci pour l'indice :) – Aakanksha

Questions connexes