2017-03-15 3 views
1

私はアンドロイドプログラミングでは新しく、アンドロイドスタジオでアニメーションを実行するには問題があります。問題は、必要なアニメーションの数が指定されていないことです。カウンタに依存します。アニメーションの後にアニメーションを実行すると、アンドロイドスタジオ

package com.example.smartpc.memorygame; 

import android.graphics.drawable.TransitionDrawable; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.AnimationSet; 
import android.view.animation.RotateAnimation; 
import android.widget.Button; 
import android.widget.ImageView; 

import java.util.ArrayList; 
import java.util.Random; 

public class MemoryGame extends AppCompatActivity { 

    ImageView imgRed; 
    ImageView imgGreen; 
    ImageView imgBlue; 
    Button btnStart; 

    ArrayList<Integer>array=new ArrayList<>(); 
    int counter=3; 
    int i=0; 
    Boolean flag=false; 

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

     imgRed=(ImageView)findViewById(R.id.imgRed); 
     imgGreen=(ImageView)findViewById(R.id.imgGreen); 
     imgBlue=(ImageView)findViewById(R.id.imgBlue); 
     btnStart=(Button)findViewById(R.id.btnStart); 

     final RotateAnimation animation=new RotateAnimation(0f,360f, RotateAnimation.RELATIVE_TO_SELF,0.5f, 
                  RotateAnimation.RELATIVE_TO_SELF,0.5f); 
     animation.setDuration(1000); 
//  animation.setRepeatCount(1); 

     animation.setAnimationListener(new Animation.AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
       ; 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       if (flag==true) { 
        i++; 
        Random rand = new Random(); 
        int number = Math.abs(rand.nextInt() % 3); 
        btnStart.setText(Integer.toString(i) + " " + Integer.toString(number)); 
        if (number == 0) { 
         imgRed.startAnimation(animation); 
        } else if (number == 1) { 
         imgGreen.startAnimation(animation); 
        } else if (number==2){ 
         imgBlue.startAnimation(animation); 
        } 
        if (i == counter - 1) { 
         i = 0; 
         flag=false; 
         return; 
        } 
       } 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
       ; 
      } 
     }); 

     imgRed.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       imgRed.startAnimation(animation); 
       flag=false; 
      } 
     }); 

     imgGreen.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       imgGreen.startAnimation(animation); 
       flag=false; 
      } 
     }); 

     imgBlue.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       imgBlue.startAnimation(animation); 
       flag=false; 
      } 
     }); 

     btnStart.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
//    imgGreen.setImageResource(R.drawable.transition); 
//    ((TransitionDrawable) imgGreen.getDrawable()).startTransition(3000); 
       flag=true; 
       Random rand = new Random(); 
       int number = Math.abs(rand.nextInt() % 3); 

       if (number == 0) { 
        imgRed.startAnimation(animation); 
       } 
       else if (number == 1) { 
        imgGreen.startAnimation(animation); 
       } 
       else if (number==2) { 
        imgBlue.startAnimation(animation); 
       } 
//    btnStart.setText(Integer.toString(i) + " " + Integer.toString(number)); 
      } 
     }); 
    } 
} 

メソッドonAnimationEnd()に問題があります。それは数を生成し、良いアニマトンを開始しますが、それはまた別のものを開始します(ランダム、何もルールがありません)。誰もがこれを解決する方法を考えているのですか?また、カウンタは固定されていません。後でコードで変更したいと思います。

答えて

1

私はそれを説明するために最善を尽くします。

プロセスがonAnimationEnd()に実行されるとき、アニメーションが終了したことを意味します。 onAnimationEnd()を待つのが好きです。そしてstartAnimation(sameAnimation)を呼び出すと、メソッドのソースコードが表示されます。

/** 
* Start the specified animation now. 
* 
* @param animation the animation to start now 
*/ 
public void startAnimation(Animation animation) { 
    animation.setStartTime(Animation.START_ON_FIRST_FRAME); 
    setAnimation(animation); 
    invalidateParentCaches(); 
    invalidate(true); 
} 

お知らせこのコード:あなたは-1と開始時刻を設定した場合animation.setStartTime(Animation.START_ON_FIRST_FRAME);

、我々が以前に実行されたアニメーションがリセットされます。おっと、アニメーションが実際に終了していないと言っていたので、最後に再実行します。

2つの画像が同時に回転していることを確認したら、その1つを回転した最後の画像にする必要があります。

アニメーションの後にアニメーションを実行する場合は、同じアニメーションをonAnimationEnd()に使用しないでください。または、View.clearAnimation()を使用して、ビューに添付されているすべてのアニメーションを消去することもできます。

お手伝いできれば嬉しいです。そして何か間違っている場合は、コメントを追加してください。

+0

私はあなたをよく理解していれば、それが終了した後も同じアニメーションが始まり、それは問題です。 3つの四角形のアニメーションが3つある場合、それは起こりませんか? –

+0

それはうまくいくはずですが、私はまだこのようにすることを提案していません。同じアニメーションを開始することはまだ可能です。私は、Animation.AnimationListenerクラスを上書きし、onAnimationEnd()に新しいアニメーションを追加したいと思います。私はこれがプログラミング仕様に沿ったより多くの方法であると思う。 – Paul

+0

私は答えを更新しました。また、startAnimation()を呼び出す前にView.clearAnimation()を追加することもできます。それはうまくいくかもしれない。 – Paul

関連する問題