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

Kotlin으로 런타임에 Android 뷰(View) 크기 구하는 방법

Kotlin으로 런타임에 Android 뷰 크기 구하기

이 튜토리얼에서는 Kotlin을 사용해 런타임에 Android 뷰(View)의 실제 크기, 즉 너비(width)와 높이(height)를 가져오는 방법을 단계별로 살펴봅니다.

Android에서 뷰의 크기는 onCreate()가 호출되는 시점에는 아직 확정되지 않습니다. 레이아웃 과정이 모두 끝나야 실제 픽셀 크기가 결정되기 때문입니다. 따라서 ViewTreeObserverOnGlobalLayoutListener를 활용하면 레이아웃이 완성되는 순간 뷰의 정확한 크기를 얻을 수 있습니다.


1단계 — 새 프로젝트 생성

Android Studio를 실행하고 File → New Project 메뉴로 이동한 뒤, 필요한 모든 정보를 입력하여 새 프로젝트를 만듭니다.

2단계 — 레이아웃 작성 (res/layout/activity_main.xml)

아래 코드를 activity_main.xml에 추가합니다. 화면에는 크기를 측정할 ImageView 하나와 결과를 표시할 TextView 하나가 배치됩니다.

<?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"
    android:orientation="vertical"
    android:padding="8dp"
    tools:context=".MainActivity">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:layout_gravity="center"
        android:src="@drawable/image" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/imageView"
        android:layout_centerInParent="true"
        android:layout_marginTop="20sp"
        android:textColor="@android:color/background_dark"
        android:textSize="16sp"
        android:textStyle="bold" />
</RelativeLayout>

3단계 — 이미지 파일 준비

화면에 표시할 이미지 파일(.png / .jpg / .jpeg)을 하나 골라 res/drawable 폴더에 복사합니다. 이 예제에서는 파일명을 image로 가정합니다.

4단계 — MainActivity.kt 작성

다음 코드를 src/MainActivity.kt에 추가합니다.

import android.os.Bundle
import android.view.View
import android.view.ViewTreeObserver.OnGlobalLayoutListener
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var imageView: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        imageView = findViewById(R.id.imageView)
        imageView.viewTreeObserver.addOnGlobalLayoutListener(GetViewSize())
    }

    internal inner class GetViewSize : OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            val view = findViewById<View>(R.id.imageView)
            val x = view.width.toString()
            val y = view.height.toString()
            (findViewById<View>(R.id.textView) as TextView).text =
                String.format("Width %s, Height: %s", x, y)
        }
    }
}

코드 설명:

  • onCreate()에서 ImageView의 참조를 얻은 뒤, 해당 뷰의 viewTreeObserverOnGlobalLayoutListener를 등록합니다.
  • onGlobalLayout()은 전역 레이아웃이 완료될 때마다 호출되며, 이 시점에는 뷰의 widthheight가 이미 측정을 마친 상태이므로 실제 픽셀(px) 값을 안전하게 읽을 수 있습니다.
  • 측정된 너비와 높이는 String.format()으로 문자열을 만들어 TextView에 출력합니다.

참고: 리스너는 레이아웃이 변경될 때마다 반복적으로 호출됩니다. 크기를 한 번만 얻으면 되는 경우라면, 값이 확인된 직후 viewTreeObserver.removeOnGlobalLayoutListener(this)를 호출해 리스너를 제거하는 것이 좋습니다.

5단계 — AndroidManifest.xml 설정

아래 코드를 androidManifest.xml에 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.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 아이콘Kotlin으로 런타임에 Android 뷰(View) 크기 구하는 방법을 클릭합니다. 옵션 목록에서 연결된 모바일 기기를 선택하면 기기 화면에 앱이 실행되고, ImageView 아래의 TextView에 뷰의 너비와 높이가 픽셀 단위로 표시됩니다.

Kotlin으로 런타임에 Android 뷰(View) 크기 구하는 방법