繁体   English   中英

按顺序对android视图进行动画处理

[英]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#BuilterAnimatorSet#playSequentially来依次播放所有AnimatorSet#playSequentially

然后,不必担心垃圾收集和清理。 只需将它们从View中删除,垃圾收集器将在准备就绪时清理它们。 但是,您可以考虑通过每次回收并重新使用ImageViews来考虑更有效的策略。 这样,您就不会不断地重建它们。 此外,它还可以防止大量的不必要的垃圾收集。 仅在动画频繁发生时才需要考虑这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM