2010-01-24 23 views
5

Ich habe eine grundlegende Animation einer Schaltfläche, nachdem es derzeit in meiner Anwendung gedrückt wird. Nachdem die Schaltfläche die Animation beendet hat, kann ich nicht mehr darauf klicken. Es drückt nicht einmal mit einem orangenen Highlight.Android-Schaltfläche reagiert nicht nach Animation

Irgendwelche Hilfe?

Hier ist mein Code:

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

Nicht sicher, was Sie mit "grundlegende Animation eines Knopfes" meinen. Verwenden Sie ein Button-Objekt oder eine benutzerdefinierte Ansicht? Könnten Sie einen Teil Ihres Codes bereitstellen, damit wir sehen können, was Sie tun? –

+0

Ah, tut mir leid, hier gehen wir. – GuyNoir

Antwort

8

Animationen nur die Zeichnung von Widgets beeinflussen, was bedeutet, nachdem die Animation erfolgt, Ihre Taste noch an seiner vorherigen Position ist. Sie müssen die Layoutparameter Ihrer Schaltfläche manuell aktualisieren, wenn Sie sie an den neuen Speicherort verschieben möchten. Auch Ihr AnimationSet und Ihr AnimationController sind nutzlos.

+0

Ah, gut, danke. Ja, diese sind übrig von früheren Sachen, die ich gemacht habe. – GuyNoir

1

Ich hatte wirklich Schwierigkeiten mit Layout-Parametern zu mischen, um den "echten" Button zu seinem animierten Ort zu bringen. Es gelang mir schließlich, this approach zu verwenden. Ich verlängerte Image und overrode 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; 
} 

Dann könnte ich diesen Knopf in der lästigen Ansicht verwenden:

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

Es ist erwähnenswert, dass all of this changes für 3.0.

6

Wenn Sie nach Abschluss der Animation auf die Schaltfläche klicken möchten, müssen Sie die Komponente manuell verschieben. Hier ist ein Beispiel für eine Animation auf eine Schaltfläche angewendet übersetzen:

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); 
    } 
} 

Verfahren startTapped() ausgelöst wird, wenn ein Benutzer auf eine Schaltfläche in der Benutzeroberfläche klickt. Der andere Knopf bewegt sich um (200,100). Am Ende entferne ich das alte und erstelle ein neues, dann füge ich es der übergeordneten Ansicht hinzu. Sie können sehen, dass buttonTapped() nach der Animation aufgerufen wird.

Ein Vorschlag: Sie können NineOldAndroids Projekt verwenden, wenn Sie sowohl die neue als auch die alte Art der Animation einer Komponente unterstützen möchten, dann können Sie die Betriebssystemversion überprüfen und diesen Code nur auf Gingerbread und niedrigeren Versionen ausführen.

+2

Ist es mir oder diese zwei Zeilen sind seltsam: params.rightMargin = 0 + params.rightMargin; params.bottomMargin = 0 + params.bottomMargin; – mbritto