Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

view.getDrawingCache() is deprecated in Android API 28

In android API 28 view.getDrawingCache() has been deprecated. Is there any newer solution to generate a Bitmap of a particular view in android.

like image 553
Mostafa Monowar Avatar asked Oct 04 '18 08:10

Mostafa Monowar


2 Answers

Two ways to get bitmap of view

  1. Using Canvas
  2. 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 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

like image 109
Ashvin solanki Avatar answered Sep 28 '22 02:09

Ashvin solanki


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()         }     } } 
like image 28
Mostafa Monowar Avatar answered Sep 28 '22 00:09

Mostafa Monowar