본문 바로가기
Android 개발/Android UI

Android에서 Java코드로 margin값 변경하기

by Developer88 2017. 2. 20.
반응형

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를 볼 수 있습니다.



728x90

댓글