도전과제 1
Do it! 안드로이드 프로그래밍(정재곤) 참조
미션: 두 개의 이미지 뷰 사이에 버튼을 두 개 만들고 오른쪽 버튼을 누르면 상단의 이미지가 하단으로 옮겨져 보이고 왼쪽 버튼을 누르면 상단으로 다시 옮겨지는 기능의 애플리케이션. 각각의 이미지는 스크롤 기능이 있어야함.
아래의 그림은 아직 이미지를 띄우지 않은 실행화면의 예제이다.

위와 같은 화면을 만들기 위해 필요한 일들에 대해 천천히 알아보도록 하겠다.
전체 소스코드는 Github 참조 (안드로이드 스튜디오 2.2)
한 화면에 두 개의 이미지 뷰 배치하기
한 화면에 두개의 이미지 뷰를 배치하는 일은 매우 쉬운 일이다. 지금까지 공부해왔던 방식대로 추가하면 된다.
기본 root 레이아웃은 원하는 레이아웃을 선택한 뒤, 두 개의 ImageView
를 XML
코드에 추가하면 된다.
다만 내가 레이아웃을 짤 때는 위의 예시 그림과 같이 깔끔한것을 원해서 LinearLayout
을 선택하였다.
레이아웃 선택
안드로이드 스튜디오(2.0이상)을 통해서 프로젝트를 생성한 뒤 기본 빈 화면을 선택할 경우, RelativeLayout
으로 설정되어있다.
이러한 상황에서 ImageView
를 두개를 넣게 되면, ImageView의 크기 조절을 강제로 하지 않는 이상 RelativeLayou
의 특성으로 인해 깔끔하게 반으로 나뉘어 지지 않는 문제가 있다.
중간에 버튼 2개까지 넣어서 3개의 수직구조로 쪼개야 하는데 이를 간단하게 하기 위해서 LinearLayout
을 선택하였다.
LinearLayout
을 선택한 가장 큰 이유는 layout_weight 속성 때문이다. 이 속성을 이용할 경우 매우 편리하게 뷰들의 구조를 배치할 수 있다.
android:layout_weight 속성은 이름 그대로 레이아웃 내의 각 뷰 혹은 레이아웃에 무게를 주는 것인데, 레이아웃에 뷰들을 배치 후 빈공간이 남을경우 어떤 뷰에 빈공간을 얼마나 할당할것인지를 정한다.
간단히 예를 들어 버튼1, 버튼2, 버튼3 3개가 있고 각각에 4, 1, 4의 무게를 부여할 경우 해당 버튼의 크기 자체가 4:1:4의 비율로 나뉘게 된다.
또한 중간의 Button
을 2개로 두기 위하여 RelativeLayout
을 혼합하였다.
<LinearLayout
android:layout_weight=9>
<ImageView
android:layout_height="0dp"
android:layout_weight="4"/>
<RelativeLayout
android:layout_weight="1">
<Button />
<Button />
</RelativeLayout>
<ImageView
android:layout_height="0dp"
android:layout_weight="4"/>
</LinearLayout>
이미지뷰에 스크롤 추가하기
이미지의 크기가 화면의 크기보다 큰 경우에 이미지를 자르거나 사이즈 조정을 하고싶지 않다면 스크롤을 을 추가해야 한다.
수직 스크롤은 ScrollView
를 이용하고 수평 스크롤은 HorizontalScrollView
를 이용하면 된다. 이전 블로깅에서 소개했듯이 원하는 뷰를 각각의 스크롤뷰로 감싸면 된다.
<ScrollView>
<HorizontalScrollView>
<ImageView />
</HorizontalScrollView>
</ScrollView>
이미지를 띄우고 버튼을 통해 이동시키기
이제 남은 일은 이미지 뷰에 실제로 이미를 보이도록 한 뒤 버튼들을 통해서 이미지를 이동시키는 일이다.
이미지 띄우기
이미지를 띄우는 방법은 2가지로 분류할 수 있다. XML
코드를 통해 기본 이미지를 띄우거나, JAVA
코드를 통해 원할 때 이미지를 띄우거나.
나는 보통 java
를 선호하므로 java
코드를 통해 이미지를 보여주도록 하였다. 미션의 3번이 상단의 이미지뷰에 하나의 이미지가 보이도록 함 이므로 onCreate
에서 바로 실행하였다.
void onCreate(...){
ImageView iv = (ImageView) findViewById(R.id.imageview1);
iv.setImageResource(R.drawable.pic1);
}
버튼을 통해 이동시키기
실제로 특정한 이미지뷰에 있는 이미지를 다른 이미지뷰로 이동시키는 메소드가 존재하는지는 검색하지 않았다.
내가 택한 방법은 UP 버튼이 클릭되면 위의 이미지뷰에 이미지를 띄우고, 아래의 이미지뷰의 이미지를 삭제하도록 하는 것이다. Down 버튼에도 마찬가지로 적용 하였다.
이미지를 이동 시킬 때에는 곧 바로 R.drawable.pic1
을 사용할 수 있지만, 최대한 하드코딩을 피하고 싶어서 setImageResource
를 사용하지 않았다. 또한 미션의 내용인 “이미지를 옮긴다” 에 걸맞도록 코드를 짜고 싶었다.
private class myOnClick implements View.OnClickListener {
public void onClick(View v) {
if (v.getId() == R.id.buttonUp) {
if (iv2.getDrawable() != null)
iv1.setImageDrawable(iv2.getDrawable());
iv2.setImageDrawable(null);
} else {
if (iv1.getDrawable() != null)
iv2.setImageDrawable(iv1.getDrawable());
iv1.setImageDrawable(null);
}
}
}
최종 결과
이번 도전과제에 필요한 내용은 이미지뷰, 버튼위젯, 스크롤뷰, 리니어레이아웃을 참조하기 바란다.
전체 소스코드는 Github 참조.
실제 수행화면은 아래의 이미지와 같다.
