2016-12-08 2 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에 카드 하나만 애니메이션으로 적용됩니다.

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(); 
} 

당신은 내가 지금은 애니메이션 완료 후 3 ImageViews마다 dealHand()가 호출을 생성하고 그들 각각을 제거하고 있습니다 볼 수 있듯이, 나는 단지 내가 150 번 ImageView를 생성 한 약 50 배에 해당하는 dealHand()를 호출 해 보았 기 때문에 내가 제대로하고 있는지 물어보아야한다. 프로파일 러에서 약 1.5MB의 RAM이 필요하다는 것을 알았다.이 1.5MB는 정리하지 못했다. System.gc()를 호출합니다.

답변

0

먼저 animation 라이브러리를 도려내고 ObjectAnimator 라이브러리를 사용하십시오. 새롭고 100 배 더 유용합니다.

그런 다음 AnimatorSet을 사용하여 애니메이션을 재생하십시오. AnimatorSets은 순차적으로 또는 순서대로 애니메이션을 재생할 수 있습니다. 애니메이션을 만든 다음 AnimatorSet#Builter 또는 AnimatorSet#playSequentially을 사용하여 모두 순서대로 재생할 수 있습니다.

그런 다음 가비지 수집 및 정리에 대해 걱정하지 마십시오. 그냥 View에서 삭제하면 가비지 컬렉터가 준비가되면이를 정리합니다. 그러나 매번 ImageView를 재활용하고 다시 사용하면보다 효율적인 전략을 고려할 수 있습니다. 그런 식으로 당신은 끊임없이 그것들을 재구성하지 않습니다. 또한 무겁고 불필요한 쓰레기 수집을 방지합니다. 애니메이션이 자주 발생하는 경우에만이를 고려해야합니다.