Runnable 인터페이스로 스레드를 만들어서 사용하는 간단한 방법에 대해서 알아보았는데 이 소스를 이용해 이미지가 돌아가는 애니메이션을 구현해 봅니다. |
Activity 가 시작되는 함수 onStart() 에서 스레드
객체를 만들어서 run() 함수를 구현합니다.
run 에는 스레드가 돌면서 핸들에 sendMessage()
사용해 이벤트를 발생시킵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Override protected void onStart() { super .onStart(); Thread myThread = new Thread( new Runnable() { public void run() { while ( true ) { try { handler.sendMessage(handler.obtainMessage()); Thread.sleep( 1000 ); } catch (Throwable t) { } } } }); myThread.start(); } |
run 함수에서 발생시킨 이벤트를 Handler 객체의
handleMessage 함수에서 메시지를 받아 처리 합니다.
1 2 3 4 5 6 7 | Handler handler = new Handler() { @Override public void handleMessage(Message msg) { updateThread(); } }; |
매번 발생할 때 마다 updateThread() 함수가
실행되게 되는데 이 함수 안에는 4개의 이미지를
번갈아 가면서 보여줍니다.
이 이미지들은 동그라미들인데 방향이 다 틀려서
4가지 이미지를 차례로 로딩하면 한바뀌 도는 것
같이 보일 겁니다. 이게 중요한 것이 아니라
스레드를 이용해서 이미지들을 바꿔서 애니메이션
효과를 얻었다는 것이죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | private void updateThread() { int mod = i % 4 ; switch (mod) { case 0 : i++; imageView.setImageResource(R.drawable.images01); break ; case 1 : i++; imageView.setImageResource(R.drawable.images02); break ; case 2 : i++; imageView.setImageResource(R.drawable.images03); break ; case 3 : i = 0 ; imageView.setImageResource(R.drawable.images04); break ; } myi.setText(String.valueOf(i)); } |
전체 activity 소스는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import android.widget.TextView; public class SampleActivity11 extends Activity { private int i = 0 ; private TextView myi; private ImageView imageView; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { updateThread(); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_sample_activity11); myi = (TextView) findViewById(R.id.i); imageView = (ImageView) findViewById(R.id.myImageView); } @Override protected void onStart() { super .onStart(); Thread myThread = new Thread( new Runnable() { public void run() { while ( true ) { try { handler.sendMessage(handler.obtainMessage()); Thread.sleep( 1000 ); } catch (Throwable t) { } } } }); myThread.start(); } private void updateThread() { int mod = i % 4 ; switch (mod) { case 0 : i++; imageView.setImageResource(R.drawable.images01); break ; case 1 : i++; imageView.setImageResource(R.drawable.images02); break ; case 2 : i++; imageView.setImageResource(R.drawable.images03); break ; case 3 : i = 0 ; imageView.setImageResource(R.drawable.images04); break ; } myi.setText(String.valueOf(i)); } } |
SSISO Community