이 튜토리얼에서는 안드로이드 앱에서 프로그래밍 방식으로 화면을 캡처하는 방법을 단계별로 알아봅니다. 뷰(View)를 비트맵(Bitmap)으로 변환하여 ImageView에 표시하는 간단한 예제를 통해 스크린샷 기능의 핵심 원리를 익힐 수 있습니다.
1단계: 새 프로젝트 생성
Android Studio를 실행하고 File → New Project 메뉴로 이동한 후, 새 프로젝트 생성에 필요한 모든 정보를 입력하여 프로젝트를 만듭니다.
2단계: 레이아웃 파일 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/parent"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#33FFFF00"
android:orientation="vertical">
<ImageView
android:id="@+id/screenShot"
android:layout_width="300dp"
android:layout_height="300dp" />
<TextView
android:id="@+id/text"
android:textSize="18sp"
android:layout_gravity="center"
android:text="Click"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>위 레이아웃에는 두 개의 뷰가 포함되어 있습니다. 하나는 캡처된 이미지를 표시할 ImageView이고, 다른 하나는 사용자가 클릭하면 스크린샷을 실행하는 TextView입니다. TextView를 클릭하면 현재 화면이 캡처되어 ImageView에 표시됩니다.
3단계: MainActivity 작성
src/MainActivity.java 파일에 아래 코드를 추가합니다.
package com.example.andy.myapplication;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
int view=R.layout.activity_main;
ImageView screenShort;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(view);
final LinearLayout parent=findViewById(R.id.parent);
screenShot=findViewById(R.id.screenShot);
textView=findViewById(R.id.text);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("It is screen shot text");
screenShot(parent);
}
});
}
public void screenShot(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
screenShot.setImageBitmap(bitmap);
textView.setText("click");
}
}핵심 코드 분석
위 코드의 핵심은 screenShot(View view) 메서드입니다. 이 메서드에는 부모 뷰(parent view)를 전달하여 화면 전체(상단부터 하단까지)를 캡처합니다. 실제 스크린샷을 수행하는 코드는 다음과 같습니다.
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); screenShort.setImageBitmap(bitmap);
동작 원리를 살펴보면 다음과 같습니다.
1. Bitmap.createBitmap(): 뷰의 너비와 높이에 맞는 빈 비트맵을 ARGB_8888 형식으로 생성합니다.
2. Canvas 객체 생성: 생성된 비트맵 위에 그림을 그릴 수 있는 캔버스를 만듭니다.
3. view.draw(canvas): 대상 뷰를 캔버스에 그려서 비트맵에 화면 내용을 담습니다.
4. setImageBitmap(): 완성된 비트맵을 ImageView에 설정하여 화면에 표시합니다.
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭합니다. 목록에서 자신의 모바일 기기를 선택하면, 기기에 아래와 같은 기본 화면이 표시됩니다.

이제 TextView를 클릭하면 화면이 캡처되어 아래와 같이 ImageView에 표시됩니다.

마무리 및 참고 사항
이 예제는 앱 내부의 특정 뷰를 캡처하는 방식입니다. 참고로 안드로이드 5.0(API 21) 이상에서는 MediaProjection API를 사용하면 다른 앱을 포함한 전체 화면을 캡처할 수도 있으며, 이 경우 사용자에게 권한 허용을 요청하는 절차가 필요합니다. 또한 저장된 이미지를 갤러리에 저장하려면 Bitmap.compress() 메서드를 활용하면 됩니다. 상황에 맞는 방식을 선택하여 활용하시기 바랍니다.