2013-10-16 60 views
0

我做了一些簡單的動畫,我呼籲呼吸,因爲對象在一個循環中慢慢變得越來越小。 然後我將這個動畫關聯到3個圖像按鈕,並且一切都正常,但是當我與一個按鈕進行交互時,要做另一個「振動」動畫,所有這些都會重新開始動畫,而預期的行爲是隻有按下的按鈕纔會有放棄了動畫。XML動畫執行同步

我想明白,更好一點,也許如何實現每個按鈕的動畫都有自己的生命週期。

這是代碼:

breath.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" > 

<scale 
    android:duration="1500" 
    android:startOffset="0" 
    android:fromXScale="0.9" 
    android:fromYScale="0.9" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:toXScale="1.0" 
    android:toYScale="1.0" 
    android:repeatMode="reverse" 
    android:repeatCount="infinite" /> 

</set> 

,這就是Java代碼:

package com.anesoft.android.citmania; 

import com.anesoft.android.citmania.models.Defines; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Typeface; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.animation.Animation; 
import android.view.animation.Animation.AnimationListener; 
import android.view.animation.AnimationUtils; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MenuActivity extends Activity implements OnClickListener, AnimationListener { 

    ImageButton opzioni; 
    ImageButton play; 
    ImageButton espansioni; 

    ImageView logo; 

    TextView title,title2; 

    Animation breath,rotate_r,rotate_l,vibrate; 
    int flag = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_menu); 

     logo = (ImageView)findViewById(R.id.logo); 
     title = (TextView)findViewById(R.id.title); 
     title2 = (TextView)findViewById(R.id.title2); 
     opzioni = (ImageButton)findViewById(R.id.options); 
     play = (ImageButton)findViewById(R.id.play); 
     espansioni = (ImageButton)findViewById(R.id.expansions); 

     breath = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.breath); 
     rotate_r = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate_right); 
     rotate_l = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate_left); 
     vibrate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.vibrate); 

     vibrate.setAnimationListener(this); 

     Typeface tf = Typeface.createFromAsset(getAssets(), "font/Canter_Light.otf"); 
     Typeface tf2 = Typeface.createFromAsset(getAssets(), "font/Canter Bold.otf"); 

     title.setTypeface(tf); 
     title2.setTypeface(tf2); 

     title.setText("CIT"); 
     title.setTextSize(Defines.TITLE_SIZE); 

     title2.setText(".MANIA"); 
     title2.setTextSize(Defines.TITLE_SIZE); 



     opzioni.startAnimation(breath); 
     play.startAnimation(breath); 
     espansioni.startAnimation(breath); 

     logo.setOnClickListener(this); 
     opzioni.setOnClickListener(this); 
     play.setOnClickListener(this); 
     espansioni.setOnClickListener(this); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu, menu); 
     return true; 
    } 

    @Override 
    public void onClick(View v) { 
     int id = v.getId(); 
     if (id == R.id.options) { 
      Intent i = new Intent(this, OptionsActivity.class); 
      i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      startActivity(i); 
     } else if (id == R.id.play) { 
      Intent i = new Intent(this, LevelPickerActivity.class); 
      i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      startActivity(i); 
     } else if(id == R.id.expansions){ 
      espansioni.startAnimation(vibrate); 
      Toast.makeText(this, "Implementando", Toast.LENGTH_SHORT).show(); 
      //espansioni.startAnimation(bounce); 
     }else if(id == R.id.logo){ 
      if(flag==0){ 
       logo.startAnimation(rotate_r); 
       flag=1; 
      }else{ 
       logo.startAnimation(rotate_l); 
       flag=0; 
      } 
     } 

    } 

    @Override 
    public void onAnimationEnd(Animation arg0) { 
     if (arg0 == vibrate) { 
      espansioni.startAnimation(breath); 
     } 
    } 

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

    } 

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

    } 

} 

你可以看到我是如何開始的振動動畫,然後當它完成我只在被點擊的按鈕中重新開始呼吸,但所有人都以同步的方式重新開始動畫。

在此先感謝

回答

1

如果你想在動畫上的所有3個按鍵獨立工作,你需要創建動畫的3個實例。

動畫一旦停止,它就會給它的視圖一個新的狀態。如果您將3個視圖分配給同一個動畫,則它們都將收到新狀態。

+0

簡單明瞭,非常感謝:) – Anearion