In android API 28 view.getDrawingCache()
has been deprecated. Is there any newer solution to generate a Bitmap of a particular view in android.
Two ways to get bitmap of view
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 bitmap Bitmap 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() } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With