В большинстве ответов на этот вопрос используется метод рисования Canvas
или метод кэширования чертежа. Однако метод View.setDrawingCache()
устарел в API 28 . В настоящее время рекомендуемым API для создания снимков экрана является класс PixelCopy
, доступный из API 24 (но методы, которые принимают параметр Window
, доступны из API 26 == Android 8.0 Oreo). Вот пример кода Kotlin для получения Bitmap
:
@RequiresApi(Build.VERSION_CODES.O)
fun saveScreenshot(view: View) {
val window = (view.context as Activity).window
if (window != null) {
val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
val locationOfViewInWindow = IntArray(2)
view.getLocationInWindow(locationOfViewInWindow)
try {
PixelCopy.request(window, Rect(locationOfViewInWindow[0], locationOfViewInWindow[1], locationOfViewInWindow[0] + view.width, locationOfViewInWindow[1] + view.height), bitmap, { copyResult ->
if (copyResult == PixelCopy.SUCCESS) {
saveBitmap(bitmap)
}
// possible to handle other result codes ...
}, Handler())
} catch (e: IllegalArgumentException) {
// PixelCopy may throw IllegalArgumentException, make sure to handle it
}
}
}