본문 바로가기
개발/안드로이드 개발

[안드로이드] gravity 속성

by 똘똘이박사 2015. 10. 29.

· 최초작성 : 2015. 10. 28.

· 최종수정 : 2015. 10. 29.

· 작성/수정내용 :

  - 여러 view 에서 거의 공통적으로 사용하고 있는 gravity 속성에 대해서 정리해 봅니다.




시작하기에 앞서...


이제 연말인가 봅니다. 날씨도 많이 추워졌습니다. 

예전에는 12월까지는 옷을 한 겹만 입고 댕겨도 거뜬했는데... 이젠 2겹 3겹 입어도 눈물이 날거 같네요... ㅜㅜ



# gravity


gravity 는 안드로이드 개발을 하다보면 정말 많이 보는 속성입니다.

뷰나 뷰그룹에 두루 사용되고 있는 속성이죠.


그래서 한 번 정리를 해보았습니다.


우선은 가장 많이 사용되는 LinearLayout와 RelativeLayout, TextView 등 에서 

공통적으로 사용되는 속성 위주로 정리 하였습니다.

(사실 저 3개 에서는 속성이 동일합니다.)


예제 화면은 LinearLayout를 기준으로 작성하였습니다.


우선 속성표를 먼저 보고 아래 예제를 보겠습니다.


속성값 

 내용

 top

 해당 위젯을 윗쪽에 위치 시킵니다. 이때 사이즈에 변화는 없습니다.

 bottom

 해당 위젯을 하단에 위치 시킵니다. 이때 사이즈에 변화는 없습니다.

 left

 해당 위젯을 왼쪽에 위치 시킵니다. 이때 사이즈에 변화는 없습니다.

 right

 해당 위젯을 오른쪽에 위치 시킵니다. 이때 사이즈에 변화는 없습니다.

 center_vertical

 해당 위젯을 세로 중앙에 위치 시킵니다. 이때 사이즈에 변화는 없습니다.

 fill_vertical

 해당 위젯의 세로를 부모 뷰그룹의 사이즈에 맞게 늘려 채워줍니다.

 center_horizontal

 해당 위젯을 가로 중앙에 위치 시깁니다. 이때 사이즈에 변화는 없습니다.

 fill_horizontal

 해당 위젯의 가로를 부모 뷰그룹의 사이즈에 맞게 늘려 채워줍니다.

 center

 해당 위젯을 정중앙에 위치 시킵니다. 이때 사이즈의 변화는 없습니다.

 fill

 해당 위젯을 가로/세로 길이를 부모 뷰그룹의 사이즈에 맞게 늘려 채워줍니다.

 clip_vertical

 해당 위젯의 세로 길이가 부모 뷰그룹보다 클 경우 넘어서는 부분은 잘라냅니다.

 clip_horizontal

 해당 위젯의 가로 길이가 부모 뷰그룹 보다 클 경우 넘어서는 부분은 잘라냅니다.

 start

 해당 위젯을 부모 뷰그룹의 시작점에 위치 시켜 줍니다. 이때 사이즈의 변화는 없습니다.

 end

 해당 위젯을 부모 뷰그룹의 마지막에 위치 시켜 줍니다. 이때 사이즈의 변화는 없습니다.



그런데 실제로 위 속성값중 실제로 어떤 속성이 자주 쓰일지 잘 모르겠습니다.

아래 그림을 보면 아시겠지만

top, left, start 는 결과 값이 같습니다.

게다가 fill 3가지 속성값은 제대로 못한 것인지 전혀 값이 나오지 안네요...

내용 대로라면 길이를 늘려야 하는데... 아... 제 영어 실력이 문제 일지도.... ㅜㅜ


아무튼 결과 화면 같이 보겠습니다.


제 핸드폰으로 실행한 화면입니다.

안드로이드 스튜디오에서 미리 보고하면 타이틀바에 'gravity'라는 글자가 안나오드라구요...

AVD를 돌리면 나오기는 하는데... 너무 버벅 거려서...


속성값 : top, bottom



속성값 : left, right


속성값 : center_vertical, center_horizontal

 



속성값 : center



속성값 : start, end

 



그리고 gravity속성은 중복 적용하여 위치를 지정할 수 있습니다.

속성을 중복 적용 하기 위해서는 | (파이프라인) 표시로 묶을 수 있습니다.


속성값 : end|bottom, start|bottom

 





그리고... clip_ .....

이 속성이 과연 얼마나 많이 쓰일지 모르겠습니다

뷰의 크기가 부모 뷰그룹의 크기 보다 클때

나머지 부분은 잘라 내라는 속성 입니다.


예를 들어

부모 뷰그룹의 가로가 200 인 화면에

가로가 300인 자식뷰를 표현 한다고 했을때

부모보다 자식의 길이가 크니까 모두 한 화면에 출력을 해줄 수 없습니다.

이럴때 어느 부분을 기준으로 자식을 잘라서 보여 주는지를 설정해 줍니다.


기준을 왼쪽에 놓는다면 오른쪽 나머지 부분이 짤리고

반대로 기준이 오른쪽이라면 왼쪽부분 부분이 짤리게 됩니다.


속성값 : clip_vertical|bottom, clip_vertical|top

 


위 그림의 좌측은 기준이 bottom 이고, 오른쪽 그림은 기준이 top 입니다.

글자는 정중앙에 오도록 설정 해놓았습니다.

따라서 좌측의 그림은 윗 부분이 잘려 나가기 때문에 글자가 중앙보다 조금 더 위쪽에 치우쳐 있고

우측의 그림은 기준이 상단에 있기 때문에 글자가 중앙에서 조금 아래 쪽으로 내려와 있습니다.


마찬 가지로 아래 그림도 기준이 오른쪽이냐 왼쪽이냐에 따라 나머지가 잘려나가게 되어

중앙에 있어야 할 글자가 좌/우로 치우쳐 보입니다.


속성값 : clip_horizontal|left, clip_horizontal|right

 



그리고 fill은... 왜 안될까요...


마지막으로

gravity는 'layout_' 가 붙은 녀석과 안붙은 녀석으로 구분할 수 있습니다.


이 둘의 차이는 누가에게 속성값을 적용할 대상의 차이라고 볼 수 있습니다.


쉽게 생각해서

layout_gravity 는 부모 뷰그룹에 '엄마 나는 이떻게 설정해주세요' 라고 하는 것과 같습니다.

그리고 gravity 는 '내 아래 있는 자식들은 이렇게 설정 하겠다.' 라고 설정하는 것입니다.


아... 그런데 최상단 뷰그룹에도 layout_gravity 를 설정할 수 있죠?

최상단 뷰그룹인데 어떻게 가능하냐구요?


이유는 간단합니다.

개발자가 수정 가능한 뷰그룹(대부분 activity_main의 최상의 뷰그룹) 위에 안드로이드에서 지정하는 뷰그룹이 존재하기 때문입니다.

그 뷰그룹은 개발자가 어찌 할 수 없는 부분이죠.



휴~


반응형