[英]Animate android views in order
对于我正在制作的二十一点游戏,我需要将卡从堆中转换为发牌人位置,然后再转换为玩家位置,因此我制定了一种通用方法。
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,并在它们完成动画后将它们移除,我只是想问一下我做得是否正确,因为我尝试调用DealHand()大约50次了它产生了150个ImageViews,我看到它在探查器中占用了约1.5Mb的RAM,即使我调用System.gc()时,也没有清理掉1.5Mb的RAM。
首先,抛弃animation
库并使用ObjectAnimator库。 它较新,实用性提高了100倍。
然后,使用AnimatorSet播放动画。 AnimatorSets
可以顺序或按顺序播放动画。 您可以只创建动画,然后AnimatorSet#Builter
使用AnimatorSet#Builter
或AnimatorSet#playSequentially
来依次播放所有AnimatorSet#playSequentially
。
然后,不必担心垃圾收集和清理。 只需将它们从View中删除,垃圾收集器将在准备就绪时清理它们。 但是,您可以考虑通过每次回收并重新使用ImageViews来考虑更有效的策略。 这样,您就不会不断地重建它们。 此外,它还可以防止大量的不必要的垃圾收集。 仅在动画频繁发生时才需要考虑这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.