Android - 스레드로 애니메이션 만들기

유의선·2023년 7월 25일
0
post-thumbnail

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


버튼을 누르면 이미지가 순서대로 변하는 애니메이션이 실행되도록 만들어보았다.

activity_main.xml 레이아웃에 이미지뷰와 버튼을 하나 추가하였다.


MainActivity.java 파일에 코드를 작성하였다.

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    ArrayList<Drawable> drawablesList = new ArrayList<Drawable>();
    Handler handler = new Handler();

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

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

        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 = drawablesList.get(index);
                index += 1;
                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();
                }
            }
        }
    }
}

ArrayList에 애니메이션에 사용할 Resource 객체들을 넣었다.

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    ArrayList<Drawable> drawablesList = new ArrayList<Drawable>();
    Handler handler = new Handler();

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

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

애니메이션을 구현하는 스레드 AnimThread를 정의하였다.

    class AnimThread extends Thread {
        public void run() {
            int index = 0;
            for(int i = 0; i < 100; i++) {
                final Drawable drawable = drawablesList.get(index);
                index += 1;
                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();
                }
            }
        }
    }

Resource 객체들을 담은 ArrayList에서 get 메소드를 통해 Drawable 객체로 이미지를 가져오고
setimageDrawable 메소드로 이미지뷰에 이미지를 설정하였다.



0개의 댓글