view.getDrawingCache() is deprecated in Android API 28
Two ways to get bitmap of view
- Using Canvas
- Using Pixel Api
Canvas Java
public Bitmap getBitmapFromView(View view){ Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); return bitmap;}public Bitmap getBitmapFromView(View view,int defaultColor){ Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawColor(defaultColor); view.draw(canvas); return bitmap;}
Canvas Kotlin
open fun getBitmapFromView(view: View): Bitmap? { var bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) var canvas = Canvas(bitmap) view.draw(canvas) return bitmap}open fun getBitmapFromView(view: View, defaultColor: Int): Bitmap? { var bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) var canvas = Canvas(bitmap) canvas.drawColor(defaultColor) view.draw(canvas) return bitmap}
Example
//@param rootView is View object which you want to get bitmapBitmap bitmap = getBitmapFromView(rootView);Bitmap bitmapColored = getBitmapFromView(rootView,Color.WHITE);
PixelCopy Api
https://stackoverflow.com/a/52985554/9909365
fun getBitmapFromView(view: View, activity: Activity, callback: (Bitmap) -> Unit) { activity.window?.let { window -> 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) { callback(bitmap) } // possible to handle other result codes ... }, Handler()) } catch (e: IllegalArgumentException) { // PixelCopy may throw IllegalArgumentException, make sure to handle it e.printStackTrace() } }}
For More
https://developer.android.com/reference/android/graphics/Bitmap
https://developer.android.com/reference/android/graphics/Canvas
I have found a way to use PixelCopy API for retrieving the view as a Bitmap. Used Kotlin
fun getBitmapFromView(view: View, activity: Activity, callback: (Bitmap) -> Unit) { activity.window?.let { window -> 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) { callback(bitmap) } // possible to handle other result codes ... }, Handler()) } catch (e: IllegalArgumentException) { // PixelCopy may throw IllegalArgumentException, make sure to handle it e.printStackTrace() } }}