按顺序为动态浏览器视图

时间:2016-12-08 19:34:58

标签: android android-animation

对于我正在制作的二十一点游戏,我需要将牌从堆中转换到经销商位置,然后转换到玩家位置,所以我为它制作了一般方法。

   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()。

1 个答案:

答案 0 :(得分:0)

首先,放弃animation库并使用ObjectAnimator库。它更新,更有用100倍。

然后,使用AnimatorSet播放动画。 AnimatorSets可以按顺序或按顺序播放动画。您可以创建动画,然后使用AnimatorSet#BuilterAnimatorSet#playSequentially按顺序播放它们。

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