2016-12-08 10 views
0

私が作っているブラックジャックのゲームでは、パイルからディーラーのポジションに、次にプレイヤーのポジションに変換するためにカードが必要なので、私は一般的な方法を作りました。アニメの順番をアニメ化する

private void dealHand() { 

    animateCard(dealer_iv_1); 
    animateCard(dealer_iv_2); 
    animateCard(player_iv_1); 
    animateCard(player_iv_2); 
} 

private void animateCard(View v) { 

    animated_card_iv.animate().x(v.getX()).y(v.getY()).setDuration(1000).withEndAction(new Runnable() { 
     @Override 
     public void run() { 
      animated_card_iv.setX(pile_iv.getX()); 
      animated_card_iv.setY(pile_iv.getY()); 
     } 
    }).start(); 
} 

これは今書いているとおり、明らかに1つのカードのみをplayer_iv_2にアニメーション化します。

TimerまたはCountDownTimerを使用してanimateCard()呼び出しの間に1000ミリ秒間待機したくありません。それはこのようなものであるために、私が望む何 は次のとおりです。

private void dealHand() { 

    animateCard(dealer_iv_1).wait(); 
    animateCard(dealer_iv_2).wait(); 
    animateCard(player_iv_1).wait(); 
    animateCard(player_iv_2); 
} 

のでanimateCardは()のタイプを返し、それが終了したとき、私に知らせている必要があります。これはどのように可能ですか?

は、これまでのところ、これは私が得たものである:

private void dealHand() { 

    animateCard(dealer_iv_1, 0); 
    animateCard(player_iv_1, 1010); 
    animateCard(player_iv_2, 2010); 


} 

private void animateCard(View v, long startDelay) { 

    final ImageView iv = new ImageView(this); 
    iv.setLayoutParams(new ViewGroup.LayoutParams(104, 149)); 
    iv.setImageResource(R.drawable.back0); 
    iv.setX(pile_iv.getX()); 
    iv.setY(pile_iv.getY()); 
    ((RelativeLayout)findViewById(R.id.pile_layout)).addView(iv); 

    iv.animate().x(v.getX()).y(v.getY()).setDuration(1000).setStartDelay(startDelay).withEndAction(new Runnable() { 
     @Override 
     public void run() { 
      ((RelativeLayout)findViewById(R.id.pile_layout)).removeView(iv); 
     } 
    }).start(); 
} 

あなたは、私が今、彼らはアニメーションが完了した後、3 ImageViewsたびdealHand()と呼ばれているの作成、およびそれらのそれぞれを削除しています見ることができるように、私はちょうど私がdealHand()を約50回呼び出してImageViewsを150回作成したので、私が正しく処理しているかどうか聞いてみると、プロファイラで約1.5MBのRAMが必要であることがわかりました。 System.gc()と呼ばれます。

答えて

0

まず、animationライブラリーを捨て、ObjectAnimatorライブラリーを使用します。これは新しいもので100倍も有用です。

次に、AnimatorSetを使用してアニメーションを再生します。 AnimatorSetsは、アニメーションを順番に、または順番に再生できます。アニメーションを作成して、AnimatorSet#BuilterまたはAnimatorSet#playSequentiallyを使用してすべてを順番に再生することができます。

ガベージコレクションとクリーンアップについて心配しないでください。 Viewからそれらを削除するだけで、準備ができたらガベージコレクタはそれらをクリーンアップします。ただし、毎回ImageViewをリサイクルして再利用することで、より効率的な戦略を検討することができます。そうすれば、あなたはそれらを絶えず再構築しているわけではありません。また、重い不要なゴミ収集をたくさん防ぎます。これは、アニメーションが頻繁に発生する場合にのみ考慮する必要があります。

関連する問題