안드로이드 화면을 캡처에 사용되는 방식으로 Canvas 그리기와 PixelCopy가 있습니다.
두 가지 모두 특정 View 영역에 대한 Bitmap을 가져와서 처리할 수 있는 건 똑같지만
Canvas, PixelCopy를 비교해서 어떤 차이가 있는지 정리해보려고 합니다.
화면 캡처 : Canvas 샘플 코드
captureScreenWithCanvas 메서드는 Canvas를 활용하여 전체화면을 캡처하는 동작을 합니다.
private fun captureScreenWithCanvas() {
val rootView = window.decorView.rootView
val width = rootView.width
val height = rootView.height
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
rootView.draw(canvas)
// TODO : 화면 캡처 결과(bitmap) 처리
bitmap.recycle()
}
화면 캡처 : PixcelCopy 샘플 코드
captureScreenWithPixelCopy 메서드는 PixcelCopy를 활용하여 전체화면을 캡처하는 동작을 합니다.
private fun captureScreenWithPixelCopy() {
val rootView = window.decorView.rootView
val width = rootView.width
val height = rootView.height
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
PixelCopy.request(
window,
bitmap,
{ copyResult ->
if (copyResult == PixelCopy.SUCCESS) {
// TODO : 화면 캡처 결과(bitmap) 처리
bitmap.recycle()
}
},
Handler(Looper.getMainLooper())
)
}
Canvas 및 PixcelCopy 둘 다 비교적 쉽게 구현이 가능합니다.
그렇다면 두 방법에는 어떤 차이가 있을까요?
Canvas vs PixelCopy 비교
Canvas 그리기 특징
- 안드로이드 하위 버전과 호환성이 높다.
- 단순하고 직관적이다.
PixelCopy 특징
- Android 7.0(API 24)부터 지원한다.
- 하드웨어 가속을 사용하여 성능과 효율성이 좋다.
두 방법을 비교했을 때 무엇보다 하드웨어 가속 유무에 집중해 볼 필요가 있습니다.
하드웨어 가속?
하드웨어 가속은 안드로이드 하드웨어 리소스를 활용해 그래픽 처리하는 기술입니다.
하드웨어 가속이 사용된 View를 가속화된 뷰(Accelerated View)라고 부르며, 이는 사용자에게 부드럽고 빠른 UI를 제공합니다.
요약해 보면 가속화된 뷰(Accelerated View)는 하드웨어 가속을 사용해서 성능 좋은 View이고,
대표적으로 구글맵, WebView, 비디오 재성(TextureView), 그래픽(OpenGL) 등이 있다!
그렇다면 하드웨어 가속 사용유무에 따라 PixelCopy와 Canvas 그리는 방식에 어떤 차이가 발생하는지 확인해 봅시다.
아래 비디오 재생(TextureView)이 포함된 화면을 각각 다른 방식으로 캡처 테스트해 본 결과입니다.
Canvas 그리기 결과는 가속화된 뷰(Accelerated View)를 그리지 못하고 검정화면으로 보이는 걸 확인할 수 있었습니다.
여담으로 한때 화면 캡처에 사용했던 View Class의 getDrawingCache 메서드가 Deprecated 되었는데요.
그 이유 중에 하나가 가속화된 뷰를 비트맵으로 가져오기에 제약이 있었기 때문이라고 합니다.
끝으로..
화면 캡처 방식에 있어서 Canvas 그리기 방식이나 PixelCopy에 대한 각각의 특징 및 차이점을 확인할 수 있었습니다.
간단하면서 일반적인 View에 대한 Bitmap을 처리해야 된다면 버전 호환성도 고려해서 Canvas를 활용할 수 있을 거고,
복잡한 View, 특히 Accelerated View가 포함되었다면 PixelCopy를 활용하면 좋을 것 같습니다.
참고자료
'안드로이드 > 코틀린' 카테고리의 다른 글
앱 백그라운드 상태 체크 : LifecycleEventObserver, DefaultLifecycleObserver (0) | 2024.05.07 |
---|---|
안드로이드 캡처 효과 예제 : CaptureEffectView (0) | 2024.05.02 |
Android 14 MediaProjection 권한 허용 : ADB Shell (0) | 2024.04.29 |
안드로이드 이미지 확대 축소 : PhotoView 예제 (0) | 2024.04.25 |
안드로이드 Room 쿼리(Query) 정리 (0) | 2023.02.21 |
댓글