Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin으로 Android에서 ImageView 여백(Margin)을 프로그래밍 방식으로 설정하는 방법

이 글에서는 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이 발생할 수 있습니다.