2013-11-25 7 views
4

나는 촛불과 불꽃을 별도의 이미지보기로 사용합니다. 사용자가 화염을 두 드렸을 때 그 드로어 블 자원은 화염이 날아간 것을 의미하는 투명하게 설정됩니다.ImageView에서 연속적인 이미지 시퀀스 표시

화염이 날아 가면서 연기를 내고 싶습니다. 이를 위해 블랙 연기가 약 21 개 이미지로 나타나 사용자가 연기처럼 보일 수 있습니다. 다음은 화염이 도청 될 때 정지되는 코드입니다 (R.drawable.smoke_22는 화염의 투명 이미지이고 R.drawable.candle_1은 노란색 화염 이미지이고 flag는 화염이 현재 날아 갔는지 여부를 나타냅니다.) flag = 불꽃은 꺼지지 않습니다

int[] smokeImages = { R.drawable.smoke_1, R.drawable.smoke_2, 
     R.drawable.smoke_3, R.drawable.smoke_4, R.drawable.smoke_5, 
     R.drawable.smoke_6, R.drawable.smoke_7, R.drawable.smoke_8, 
     R.drawable.smoke_9, R.drawable.smoke_10, R.drawable.smoke_11, 
     R.drawable.smoke_12, R.drawable.smoke_13, R.drawable.smoke_14, 
     R.drawable.smoke_15, R.drawable.smoke_16, R.drawable.smoke_17, 
     R.drawable.smoke_18, R.drawable.smoke_19, R.drawable.smoke_20, 
     R.drawable.smoke_21 }; 


    this.flamImageView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (flag) { 
       flamImageView.setImageDrawable(getResources().getDrawable(
         R.drawable.smoke_22)); 
       flag = false; 
       startTimer(); 
      } else { 
       flamImageView.setImageDrawable(getResources().getDrawable(
         R.drawable.candle_1)); 
       flag = true; 
       smokemageView.setImageResource(R.drawable.smoke_22); 
      } 
     } 
    }); 
} 

private void startTimer() { 
    for (int i = 0; i < 21; i++) { 
     try { 
      Thread.sleep(250); 
      smokemageView.setImageResource(smokeImages[i]); 
     } catch (InterruptedException localInterruptedException) { 
     } 
    } 
    smokemageView.setImageResource(R.drawable.smoke_22); 
} 

반복적 인 터치에 다시 온다하지만 난 당신이 단순히에 문을 위해 포장 할 수

+0

그것은 답변하지만, 단지 작은 힌트 아니다. 안드로이드는 애니메이션 GIF를 지원합니까? 아마도 그것은 당신의 문제를 매우 쉽게 해결할 것입니까? – user2707175

+0

setImageResource는 UI 스레드에서 호출해야합니다. runOnUiThread를 사용하거나 핸들러에 게시하십시오. – njzk2

답변

8

적절한 연기 애니메이션을 볼 수 없습니다 : flase)는 불꽃이 여전히 조명을 의미합니다 while 루프는 부울 값으로 설정합니다. 드로어 블을 애니메이션으로 만들 때마다 부울을 true로 설정하면됩니다. (아마도 더 쉽게, 더 오류 방지 경로)

AnimationDrawable anim = new AnimationDrawable(); 
     anim.addFrame(
       getResources().getDrawable(R.drawable.smoke_1), 
       250); 
     anim.addFrame(
       getResources().getDrawable(R.drawable.smoke_2), 
       250); 
     anim.addFrame(
       getResources().getDrawable(R.drawable.smoke_3), 
       250); 
     anim.addFrame(
       getResources().getDrawable(R.drawable.smoke_4), 
       250); 

     //......So on, so forth until you have a satisfying animation sequence 


     //set ImageView to AnimatedDrawable 
     smokemageView.setImageDrawable(anim); 

     //if you want the animation to loop, set false 
     anim.setOneShot(false); 
     anim.start(); 

확실이 도움이되기를 바랍니다, 해피 코딩 :

다른
private void startTimer() { 

while (timing) { 
    for (int i = 0; i < 21; i++) { 
     try { 
      Thread.sleep(250); 
      smokemageView.setImageResource(smokeImages[i]); 
     } catch (InterruptedException localInterruptedException) { 
     } 
    } 
    } 
    smokemageView.setImageResource(R.drawable.smoke_22); 
} 

당신은 AnimationDrawable 개체를 만들 수 있습니다!

+0

AnimationDrawable이 우수하며 잘 작동합니다. 한 번만 작은 관심사, 나는 애니메이션이 한 라운드의 실행을 완료 한 후 다른 투명 드로어 블을 설정할 수있는 방법이 없습니다. 어떤 포인터 pls. 편집 : 오! 내가 어떻게 그렇게 바보가 될 수 있는지, 나는 투명한 이미지를 마지막 프레임으로 설정해야했다. 귀하의 대답을 주셔서 감사합니다 – Sandeep

+0

네, 그려진 테이블이 반복 된 후 있는지 확인한 다음 투명한 드로어 블을 설정하십시오.다행히 도울 수있어서 다행이야! – MattMatt

+0

좋은 하나! 1+ 내가 이것을 더 빨리 발견했습니다. – PaperThick

0

Thread.sleep이 좋지 않습니다. 정말 나빴어.

그러나 Timer 또는 Handler을 사용하는 것이 좋습니다. TimerTask를위한

작은 예 :

Timer timer = new Timer(); 
timer.schedule(new ImageTask(), 0, 250); 

class ImageTask extends TimerTask { 
    public void run() { 
     // Change image here. 
    } 
} 

클래스는 ImageTask는 250ms마다 실행됩니다. 거기에서 이미지를 변경할 수 있습니다. 핸들러에 대한

작은 예 :

final Handler handler = new Handler(); 
final Runnable r = new Runnable() { 
    public void run() { 
     // Change image here. 
     handler.postDelayed(this, 250); 
    } 
}; 
handler.post(r); 

그것은 당신의 문제를 해결할 수 있습니다,하지만 멀리하지 않음으로써 그것을 할 수있는 가장 좋은 방법입니다. GreyBeardedGeek는 문제를 해결할 수있는 좋은 대안입니다.

관련 문제