2010-01-24 19 views
5

Tengo una animación básica de un botón después de que se presiona actualmente en mi aplicación. Cuando el botón termina de animar, ya no puedo hacer clic en él. Ni siquiera presiona con un resaltado naranja.Botón de Android no responde después de la animación

¿Algún ayuda?

Aquí está mi código:

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

animation = new AnimationSet(true); 
animation.setFillAfter(true); 
Animation translate = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 5.0f); 
translate.setDuration(500); 
animation.addAnimation(translate); 

LayoutAnimationController controller = new LayoutAnimationController(animation, 0.25f); 


generate = (Button)findViewById(R.id.Button01); 

generate.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v){ 
      keyFromTop(); 

     } 
    }); 


} 

public void keyFromTop(){ 
    generate.setAnimation(animation);  
} 
+0

No estoy seguro de lo que quiere decir con "animación básica de un botón". ¿Estás usando un objeto Button o algún tipo de vista personalizada? ¿Podría proporcionarnos parte de su código para que podamos ver lo que está haciendo? –

+0

Ah, lo siento, aquí vamos. – GuyNoir

Respuesta

8

Animaciones afectan sólo al dibujo de los widgets, lo que significa que después de la animación se realiza, el botón se encuentra todavía en su ubicación anterior. Necesita actualizar manualmente los parámetros de diseño de su botón si desea moverlo a la nueva ubicación. Además, su AnimationSet y su AnimationController son inútiles.

+0

Ah, bien, gracias. Sí, quedan restos de cosas anteriores que estaba haciendo. – GuyNoir

1

Realmente luché con la reorganización de los parámetros de diseño para hacer que el botón "real" coincidiera con su ubicación animada. Finalmente lo logré usando this approach. Extendí ImageButton y hizo caso omiso de getHitRect:

@Override 
public void getHitRect(Rect outRect) { 
    Rect curr = new Rect(); 
    super.getHitRect(curr); 
    outRect.bottom = curr.bottom + 75; 
    outRect.top = curr.top + 75; 
    outRect.left = curr.left; 
    outRect.right = curr.right; 
} 

Entonces, podría utilizar este botón en la vista problemático:

<com.sample.YPlus75ImageButton a:id="@+id/.... 

Vale la pena señalar que all of this changes de 3.0.

6

Si desea poder hacer clic en el botón una vez completada la animación, debe mover el componente manualmente. He aquí un ejemplo de una animación traducir aplicada a un botón:

public class Test2XAnimation extends Activity { 

    private RelativeLayout buttonContainer; 

    private Button button; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     button = (Button) this.findViewById(R.id.button1); 
     buttonContainer = (RelativeLayout) button.getParent(); 
    } 

    public void startTapped(View view) { 
     animateButton(200, 100); 
    } 

    public void buttonTapped(View view) { 
     Toast.makeText(this, "tap", Toast.LENGTH_SHORT).show(); 
    } 

    private RelativeLayout.LayoutParams params; 
    private CharSequence title; 

    private void animateButton(final int translateX, final int translateY) { 
     TranslateAnimation translate = new TranslateAnimation(0, translateX, 0, 
       translateY); 
     translate.setDuration(1500); 
     translate.setAnimationListener(new AnimationListener() { 

      public void onAnimationEnd(Animation animation) { 
       buttonContainer.removeView(button); 
       button = new Button(Test2XAnimation.this); 
       button.setText(title); 
       button.setOnClickListener(new OnClickListener() { 

        public void onClick(View v) { 
         buttonTapped(button); 
        } 
       }); 

       params.leftMargin = translateX + params.leftMargin; 
       params.topMargin = translateY + params.topMargin; 
       params.rightMargin = 0 + params.rightMargin; 
       params.bottomMargin = 0 + params.bottomMargin; 
       button.setLayoutParams(params); 
       buttonContainer.addView(button); 
      } 

      public void onAnimationRepeat(Animation animation) { 

      } 

      public void onAnimationStart(Animation animation) { 
       params = (RelativeLayout.LayoutParams) button.getLayoutParams(); 

       title = button.getText(); 
      } 

     }); 
     button.startAnimation(translate); 
    } 
} 

El método startTapped() se activa cuando un usuario hace clic en un botón en la interfaz de usuario. El otro botón se mueve por (200,100). Al final, elimino el anterior y creo uno nuevo, pero lo agrego a la vista principal. Puede ver que se llama buttonTapped() después de la animación.

Sugerencia: puede utilizar el proyecto NineOldAndroids si desea admitir la forma nueva y antigua de animar un componente, luego puede verificar la versión del SO y ejecutar este código solo en Gingerbread y versiones inferiores.

+2

¿Soy yo o esas dos líneas son raras: params.rightMargin = 0 + params.rightMargin; params.bottomMargin = 0 + params.bottomMargin; – mbritto

Cuestiones relacionadas