-
[ Android ] 스레드 애니메이션Android 2020. 3. 27. 14:55
이 글은 부스트코스 강의를 공부하며 요약한 글입니다.
CatServant
Animation
Android에는 두 뷰 계층 간의 변경사항을 쉽게 애니메이션할 수 있는 전환 프레임워크가 있습니다. 이 프레임워크는 시간이 흐름에 따라 일부 속성 값을 변경하여 런타임 시 뷰를 애니메이션합니다. 프레임워크에는 흔히 사용되는 효과를 위한 애니메이션이 내장되어 있으며, 맞춤 애니메이션 및 전환 수명 주기 콜백을 만들 수 있습니다.
애니메이션을 언제 사용해야 하는지 더 잘 이해하려면 모션에 대한 머티리얼 디자인 가이드도 참조하세요.
Code
- MainActivity.java
public class MainActivity extends AppCompatActivity { ArrayList<Drawable> imageList = new ArrayList<Drawable>(); ImageView imageView; Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Resources res = getResources(); imageList.add(res.getDrawable(R.drawable.image2)); imageList.add(res.getDrawable(R.drawable.image3)); imageList.add(res.getDrawable(R.drawable.image4)); imageList.add(res.getDrawable(R.drawable.image5)); imageList.add(res.getDrawable(R.drawable.image6)); imageView = (ImageView) findViewById(R.id.imageView); Button 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 { @Override public void run() { for (int i=0; i<100; i++) { int curIdx = i % 5; final Drawable drawable = imageList.get(curIdx); handler.post(new Runnable() { @Override public void run() { imageView.setImageDrawable(drawable); } }); try { // 1초에 한 번씩 바꾸기 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
이미지뷰에 드로어블 객체를 설정할 때는 setImageDrawable 메소드를 사용할 수 있습니다.
그런데, 이미지뷰를 접근하는 이 코드가 스레드 안에 들어 있으므로 문제가 발생합니다. 즉, 별도로 만들어진 스레드 안에서 UI 객체인 이미지뷰를 접근하면 동시 접근의 문제가 발생하므로 반드시 핸들러를 사용해야 합니다.
핸들러를 사용할 때는 Handler 객체를 하나 정의한 후 post 메소드를 호출하는 것이 가장 간단합니다. post 메소드를 호출하면서 전달하는 Runnable 객체 안에 setImageDrawable 메소드를 호출하는 코드를 넣어주면 해당 코드가 메인 스레드에서 동작하면서 이미지를 변경해주게 됩니다.
출처
'Android' 카테고리의 다른 글
[ Android ] 스플래시 화면 ( 로딩 화면 ) (0) 2020.04.02 [ Android ] ListView (0) 2020.03.31 [ Android ] 페이지 슬라이딩 (0) 2020.03.31 [ Android ] 트윈 애니메이션 (0) 2020.03.30 [ Android ] 인텐트 (0) 2020.03.03