Android에서 레이아웃을 잡을 때는 XML을 이용하는데요.
하지만, 경우에 따라서, 동적으로 프로그래밍된 값으로 element를 움직여줘야 할 때가 있습니다.
이 때는 동적으로 margin값을 잡아줘야 할텐데요.
오늘은 이것에 대해서 정리해 보도록 하겠습니다.
1. 기본 Layout 정의
아래와 같이 Text밑에 LinearView가 있고,
그 밑에 LinearLayout안에 ImageView와 TextView가 있는 구조를 만들어 보겠습니다.
위 XML은 아래와 같이 보입니다.
2. Java 코드
저희가 이동시킬 대상은 id가 img_test인 안드로이드아이콘을 소스로 가지고 있는, ImgView인데요.
이 뷰의 마진 값을 저장하려면 LayoutParams객체를 가져와서 수정해야 합니다.
이 LayoutParams는 해당 View의 뷰모에게,
내가 어떻게 레이아웃 되기를 원한다고 애기하는 것인데요.
해당view.getLayoutParams() 메소드를 이용하고,
받아온 LayoutParams는 실제 상위 ViewGroup의 형태로 형변환을 해주어야 합니다.
예를들면, 위의 XML기준으로는 ImgView위에 LinearLayout이 상위 ViewGroup이므로,
LinearLayout.LayoutParams 형태로, 형변환을 해주어야 합니다.
실제 코드를 작성하기 전에 getLayoutParams()의 소스코드를 보고 가겠습니다.
getLayoutParams가 리턴해주는 mLayoutParams는 부모에게 이 뷰가 어떻게 arrange되기를 원하는 지를 제공해준다고 되어 있군요.
이제 위에서 작성한 XML의 이미지뷰의 layoutParams를 가져와서, 부모ViewGroup의 LayoutParams형태로 형변환하도록 하겠습니다.
위에서 얻은 mLayoutParams객체를 가지고 이동시킬 값을 설정해주면 되는데요.
Start버튼을 누르면, 1초에 1px씩 마진값을 이동시키도록 해보겠습니다.
이것의 구현은 아래와 같이 버튼을 누르면, WorkerThread를 생성해서 하도록 하구요.
얻어온 mLayoutParams에 topMargin값을, 매초 10의 배수Px이 되도록 set해줍니다.
그리고 설정된 mLayoutParams를 setLayoutParams() 메소드를 이용하여, 이미지뷰에 전달해 주면 됩니다.
위와 같이 구현하고 앱을 실행하면,
아래와 같이, 1초 10px씩 아래로 향하는 Image를 볼 수 있습니다.
'Android 개발 > Android UI' 카테고리의 다른 글
clipChildren 으로 ViewGroup의 범위를 벗어나는 안드로이드 UI (0) | 2017.04.17 |
---|---|
안드로이드에서 카톡방식의 ViewPager + Tab 레이아웃 구현 (4) | 2017.03.13 |
ConstraintLayout 의 매력에 빠져보겠습니다 (0) | 2017.03.10 |
CollapsingToolbarLayout 으로 구현한 닫혀지는 ActionBar (0) | 2017.03.05 |
안드로이드 ActionBar에 Menu 를 구현해보자 (0) | 2017.03.02 |
Android 에서 동적으로 View 추가하기 #LayoutInflater (0) | 2017.02.21 |
안드로이드 Custom Toolbar 와 Theme 적용하기 (0) | 2017.01.23 |
Android에서 Time Picker 생성하기 (4) | 2017.01.15 |
Android 에서 Button 눌렸을 때 이미지 변경 방법 (0) | 2016.12.30 |
Android 라인(수평선, 수직선) 그리기 (0) | 2016.12.20 |
댓글