이 글에서는 Kotlin을 사용해 Android 앱 내부에서 프로그래밍 방식으로 화면을 캡처하고, 캡처한 이미지를 ImageView에 바로 표시하는 방법을 단계별로 살펴봅니다. 별도의 외부 라이브러리 없이 View의 드로잉 캐시(Drawing Cache)만으로 구현할 수 있는 간단한 예제입니다.
1단계: 새 프로젝트 생성
Android Studio에서 File → New Project를 선택한 후, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 작성 (res/layout/activity_main.xml)
스크린샷을 실행할 버튼과 캡처된 이미지를 보여줄 ImageView를 배치합니다.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" android:id="@+id/main" style="?attr/actionButtonStyle" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" android:text="Take screenshot" /> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/button" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" android:scaleType="fitCenter" /> </RelativeLayout>
3단계: 메인 액티비티 코드 작성 (src/MainActivity.kt)
버튼을 클릭하면 루트 뷰(Root View)의 드로잉 캐시를 비트맵으로 변환해 ImageView에 표시하고, 배경색을 회색(#999999)으로 변경합니다.
import android.graphics.Bitmap
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {
private lateinit var main: View
private lateinit var imageView: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
main = findViewById(R.id.main)
imageView = findViewById(R.id.imageView)
val btn: Button = findViewById(R.id.button)
btn.setOnClickListener {
val b: Bitmap = Screenshot.takeScreenshotOfRootView(imageView)
imageView.setImageBitmap(b)
main.setBackgroundColor(Color.parseColor("#999999"))
}
}
companion object Screenshot {
private fun takeScreenshot(view: View): Bitmap {
view.isDrawingCacheEnabled = true
view.buildDrawingCache(true)
val b = Bitmap.createBitmap(view.drawingCache)
view.isDrawingCacheEnabled = false
return b
}
fun takeScreenshotOfRootView(v: View): Bitmap {
return takeScreenshot(v.rootView)
}
}
}4단계: 매니페스트 설정 (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에 표시되는 것을 확인할 수 있습니다.
참고: Drawing Cache 지원 중단(Deprecated) 안내
예제에서 사용한 isDrawingCacheEnabled와 buildDrawingCache()는 API 28(Android 9)부터 공식적으로 지원이 중단되었습니다. 최신 Android 버전을 대상으로 한다면 PixelCopy API나 Canvas에 직접 View를 그리는 방식(view.draw(canvas))을 사용하는 것이 좋습니다. 다만 학습 목적이나 하위 버전 호환성을 고려한 간단한 구현에는 위 예제가 여전히 유용하게 활용될 수 있습니다.