对于我正在制作的二十一点游戏,我需要将牌从堆中转换到经销商位置,然后转换到玩家位置,所以我为它制作了一般方法。
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();
}
正如它现在所写的,它显然只会为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();
}
正如你所看到的,我现在每次调用dealHand()时都会创建3个ImageView,并在完成动画后删除每个ImageView,我只是想问我是否正确地做了以后我尝试过调用dealHand()约50次产生150个ImageViews,我看到它在Profiler中占用了大约1.5Mb的RAM,这个1.5Mb没有清理,即使我打电话给System.gc()。
答案 0 :(得分:0)
首先,放弃animation
库并使用ObjectAnimator库。它更新,更有用100倍。
然后,使用AnimatorSet播放动画。 AnimatorSets
可以按顺序或按顺序播放动画。您可以创建动画,然后使用AnimatorSet#Builter
或AnimatorSet#playSequentially
按顺序播放它们。
然后,不要担心垃圾收集和清理。只需从View中删除它们,垃圾收集器就会在它准备就绪时将它们清理干净。但是,您可以通过每次回收和重新使用ImageView来考虑更有效的策略。这样你就不会经常重建它们。此外,它可以防止大量繁重,不必要的垃圾收集。如果动画经常发生,则只需要考虑这一点。