이 글에서는 Kotlin을 사용하여 Android 앱에서 ImageView의 여백(margin)을 XML이 아닌 코드로 직접 설정하는 방법을 단계별로 알아봅니다. 레이아웃을 동적으로 조정해야 하는 상황에서 매우 유용하게 활용할 수 있는 기능입니다.
1단계: 새 프로젝트 생성
Android Studio를 실행하고 File → New Project 메뉴로 이동한 후, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다. 언어는 Kotlin으로 선택합니다.
2단계: 레이아웃 파일 작성 (res/layout/activity_main.xml)
아래 코드를 res/layout/activity_main.xml에 추가합니다. RelativeLayout 안에 ImageView 하나를 배치하는 기본 구조입니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/image" />
</RelativeLayout>3단계: MainActivity.kt 작성
핵심 부분입니다. 아래 코드를 src/MainActivity.kt에 추가합니다. ImageView의 layoutParams를 가져와서 setMargins() 메서드로 여백을 지정한 뒤, 다시 layoutParams에 할당하는 방식입니다.
import android.os.Bundle
import android.widget.ImageView
import android.widget.RelativeLayout
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
lateinit var imageView: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
imageView = findViewById(R.id.imageView)
// 부모 레이아웃에 맞는 LayoutParams로 캐스팅
val layoutParams = imageView.layoutParams as RelativeLayout.LayoutParams
// 순서대로 left(좌), top(상), right(우), bottom(하) 여백 (픽셀 단위)
layoutParams.setMargins(100, 100, 100, 100)
imageView.layoutParams = layoutParams
}
}코드 설명
setMargins(left, top, right, bottom) 메서드는 네 개의 인자를 받으며, 각각 왼쪽·위쪽·오른쪽·아래쪽 여백을 의미합니다. 이때 값의 단위는 픽셀(px)이라는 점에 주의하세요. 화면 밀도에 따라 크기가 달라질 수 있으므로, 실제 프로젝트에서는 dp 값을 px로 변환하여 사용하는 것이 좋습니다.
예를 들어 다음과 같이 변환 유틸리티를 활용할 수 있습니다:
val marginInDp = 16 val scale = resources.displayMetrics.density val marginInPx = (marginInDp * scale).toInt() layoutParams.setMargins(marginInPx, marginInPx, marginInPx, marginInPx)
4단계: AndroidManifest.xml 확인
androidManifest.xml에는 별도의 권한 추가 없이 기본 구성 그대로 사용하면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.q11">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run ▶ 버튼을 클릭하세요. 목록에서 연결된 모바일 기기를 선택하면, 앱이 실행되고 ImageView 주변에 지정한 여백이 적용된 화면을 확인할 수 있습니다.
실행 결과, 이미지가 화면 가장자리로부터 일정한 거리만큼 떨어져 표시되는 것을 볼 수 있습니다.
마무리
이처럼 Kotlin에서는 layoutParams를 활용해 ImageView뿐 아니라 모든 View의 여백을 런타임에 동적으로 조절할 수 있습니다. 참고로 LinearLayout을 사용하는 경우에는 LinearLayout.LayoutParams로, ConstraintLayout을 사용하는 경우에는 ConstraintLayout.LayoutParams로 캐스팅해야 한다는 점을 기억하세요. 부모 레이아웃 종류와 맞지 않는 LayoutParams를 사용하면 ClassCastException이 발생할 수 있습니다.