여러 이미지를 연속으로 바꿔가며 애니메이션 효과를 만들소 싶을 때 스레드를 사용하는 경우가 많다.
버튼을 누르면 이미지가 순서대로 변하는 애니메이션이 실행되도록 만들어보았다.
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 메소드로 이미지뷰에 이미지를 설정하였다.