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

Kotlin으로 안드로이드 앱에서 픽셀(px)을 dp로 변환하는 방법

안드로이드 개발에서 dp(밀도 독립 픽셀)는 화면 밀도와 관계없이 일관된 UI 크기를 유지하기 위해 사용하는 단위입니다. 반면 픽셀(px)은 기기의 실제 물리적 화소를 의미하므로 같은 값이라도 기기마다 표시 크기가 달라질 수 있습니다. 이 글에서는 Kotlin을 사용해 안드로이드 앱에서 픽셀 값을 dp로 변환하는 방법을 단계별로 알아보겠습니다.

1단계: 새 프로젝트 생성

Android Studio에서 File → New Project 메뉴로 이동한 후, 프로젝트 생성에 필요한 정보를 모두 입력하여 새 프로젝트를 만듭니다.

2단계: activity_main.xml 레이아웃 구성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 화면 중앙에는 변환을 실행할 버튼을, 그 아래에는 결과를 표시할 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"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Convert Pixels to DPs" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button"
        android:textAlignment="center"
        android:textColor="#ff0000"
        android:textSize="24sp"
        android:textStyle="bold" />
</RelativeLayout>

3단계: MainActivity.kt 코드 작성

src/MainActivity.kt 파일에 아래 코드를 추가합니다. 변환 공식의 핵심은 resources.displayMetrics.densityDpi를 160으로 나눈 밀도 배율(density)로 픽셀 값을 나누는 것입니다. 여기서는 반올림된 정수 dp 값과 소수점을 유지하는 실제 dp 값을 각각 반환하는 두 함수를 함께 구현했습니다.

import android.content.Context
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlin.math.roundToInt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        val button = findViewById<Button>(R.id.button)
        val textView = findViewById<TextView>(R.id.textView)
        button.setOnClickListener {
            val pixelsOne = 38
            val pixelsTwo = 43
            val context: Context = applicationContext
            textView.text = """
            Convert Pixels to integer DPs value:
            ${pixelsOne}pixels = ${getDPsFromPixels(context, pixelsOne)}dp
            ${pixelsTwo}pixels = ${getActualDPsFromPixels(context, pixelsTwo)}
            """.trimIndent()
            textView.text = (textView.text.toString() + "Convert Pixels to perfect DPs value: \n"
                + pixelsOne + "pixels = " + getActualDPsFromPixels(context, pixelsOne)
                + "dp\n" + pixelsOne + "pixels = " + getActualDPsFromPixels(context, pixelsOne))
        }
    }

    private fun getDPsFromPixels(context: Context, pixels: Int): Int {
        val resources = context.resources
        return (pixels / (resources.displayMetrics.densityDpi / 160f)).roundToInt()
    }

    private fun getActualDPsFromPixels(context: Context, pixels: Int): Float {
        val resources = context.resources
        return pixels / (resources.displayMetrics.densityDpi / 160f)
    }
}

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 Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 본인의 모바일 기기를 선택하세요. 그러면 기기 화면에 픽셀→dp 변환 결과가 표시됩니다.