2016-12-08 4 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(); 
} 

Как сейчас написано, очевидно, что он будет олицетворять только одну карту player_iv_2.

Я не хочу ждать 1000 миллисов между вызовами animateCard() с использованием таймера или CountDownTimer. Что я хочу, чтобы это было что-то вроде этого:

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 раз, что вызвало 150 из ImageViews, я видел, что в профилировщике потребовалось около 1,5 МБ ОЗУ, этот 1.5Mb не убирался, даже когда я называется System.gc().

ответ

0

Сначала разместите библиотеку animation и используйте библиотеку ObjectAnimator. Он новее и полезен в 100 раз.

Для воспроизведения анимации используйте AnimatorSet. AnimatorSets может воспроизводить анимацию последовательно или по порядку. Вы можете просто создать свои анимации и либо использовать AnimatorSet#Builter, либо AnimatorSet#playSequentially, чтобы играть в них все по порядку.

Тогда не беспокойтесь о сборке мусора и очистке. Просто удалите их из View, и сборщик мусора очистит их, когда он будет готов. Тем не менее, вы можете рассмотреть более эффективную стратегию путем повторного использования и повторного использования ImageViews каждый раз. Таким образом, вы не постоянно воссоздаете их. Кроме того, он предотвращает много тяжелых ненужных сборов мусора. Это нужно будет учитывать только в том случае, если анимация происходит часто.