티스토리 뷰

여러 이미지를 연속해서 바꿔가며 애니메이션 효과를 만들고 싶을 때 스레드를 사용하는 경우가 많다. 

특히 표준 자바에서 게임 들에 사용하는 대부분의 애니메이션 효과는 스레드를 사용하므로 기존의 앱 소스를 안드로이드용으로 포팅하려고 할 때는 이미 만들어두었던 코드와 같은 방식을 사용하는 것이 가장 쉽기 때문에 많이 사용한다.

 

바로 예제를 한번 확인해보자.


ImageView를 하나 생성하고, 버튼을 눌렀을 때 스레드가 지속적으로 Runnable객체를 사용하여 ImageView의 이미지를 바꿔주는 간단한 예제이다. 

 

◎MainActivity.java

package com.example.samplethreadanimation;

import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    ImageView imageView;

    ArrayList<Drawable> drawableList = new ArrayList<Drawable>();
    Handler handler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        drawableList.add(res.getDrawable(R.drawable.face1, null));
        drawableList.add(res.getDrawable(R.drawable.face2, null));
        drawableList.add(res.getDrawable(R.drawable.face3, null));
        drawableList.add(res.getDrawable(R.drawable.face4, null));
        drawableList.add(res.getDrawable(R.drawable.face5, null));

        imageView = findViewById(R.id.imageView);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AnimThread thread = new AnimThread();
                thread.start();
            }
        });
    }


    class AnimThread extends Thread {
        public void run() {
            int index = 0;
            for(int i = 0; i < 100; i++) {
                final Drawable drawable = drawableList.get(index);
                index ++;

                if(index > 4) {
                    index = 0;
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        imageView.setImageDrawable(drawable);
                    }
                });

                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

'Mobile > Android' 카테고리의 다른 글

[Android] Volley lib  (0) 2022.04.10
[Android] HTTP로 웹 서버에 요청/응답하기  (0) 2022.04.09
[Android] AsyncTask  (0) 2022.04.07
[Android] Thread로 메시지 전송  (0) 2022.04.07
[Android] Runnable 2: postDelayed  (0) 2022.04.06
Comments