view.getDrawingCache() está en desuso en Android API 28

5 minutos de lectura

Avatar de usuario de Mostafa Monowar
Mostafa Monowar

En la API de Android 28 view.getDrawingCache() ha quedado en desuso. ¿Hay alguna solución más nueva para generar un mapa de bits de una vista en particular en Android?

Avatar de usuario de Ashvin solanki
Ashvin Solanki

Dos formas de obtener un mapa de bits de la vista

  1. Uso de lienzo
  2. Uso de la API de píxeles

Canvas Java

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;
}

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

fun getBitmapFromView(view: View): Bitmap {
    val bitmap = Bitmap.createBitmap(
        view.width, view.height, Bitmap.Config.ARGB_8888
    )
    val canvas = Canvas(bitmap)
    view.draw(canvas)
    return bitmap
}

fun getBitmapFromView(view: View, defaultColor: Int): Bitmap {
    val bitmap = Bitmap.createBitmap(
        view.width, view.height, Bitmap.Config.ARGB_8888
    )
    val 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()
        }
    }
}

Para obtener más información, consulte Acerca de

mapas de bits

Lienzo

  • ¿Cómo puedo obtener una parte de la vista? createBitmap parece tomar solo ancho y alto, buscando x, y, ancho, alto

    – Alex

    22 de febrero de 2019 a las 16:40

  • @Alex usuario esto Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)

    –Ashvin solanki

    23 de febrero de 2019 a las 4:54


  • y cómo obtienes la fuente ahora. Bcz view.getDrawingCache() está en desuso y devolvía un mapa de bits.

    – Alex

    23 de febrero de 2019 a las 20:51


  • @Alex primero usa este método para obtener un mapa de bits para ver la modificación que necesites

    –Ashvin solanki

    24 de febrero de 2019 a las 12:47

Avatar de usuario de Mostafa Monowar
Mostafa Monowar

Encontré una manera de usar la API de PixelCopy para recuperar la vista como un mapa de bits. Usado 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()
        }
    }
}

  • árbitro

    – daka

    3 feb 2019 a las 16:00


  • ¿Por qué Google siempre tiene que complicar las cosas? Quiero el mapa de bits al mismo tiempo que llamo al método no más adelante en el futuro usando devoluciones de llamada.

    – TheRealChx101

    10 de febrero de 2019 a las 13:03

  • @ TheRealChx101 Encontré esto hoy que voy a usar en su lugar.

    – daka

    15 de febrero de 2019 a las 23:30

  • PixelCopy requiere nivel de API 26 y superior. Si desea compatibilidad, para un nivel de API anterior, use la solución publicada por @daka.

    –Morgan Koh

    12 de marzo de 2019 a las 8:02


  • @daka puedes usar Enlace esta biblioteca Maneja todas las cosas para guardar una imagen de una vista.

    – Mostafa Monowar

    12 de marzo de 2019 a las 10:56

Avatar de usuario de Antonio Vlasic
antonio vlasic

A partir de la documentación oficial getDrawingCache() deberías usar el copia de píxeles API.

  • ¿Necesito usar SurfaceView para usar PixelCopy()? Porque en la documentación de Android dice “solicitudes de copia de píxeles para permitir operaciones de copia de Surface a Bitmap”.

    – Mostafa Monowar

    4 oct 2018 a las 10:02

  • agregue un ejemplo de pixelCopy () para capturar el mapa de bits de la vista

    –Ashvin solanki

    20 de octubre de 2018 a las 12:28


  • @Ashvinsolanki, consulte mi respuesta. Funciona en

    – Mostafa Monowar

    25 de octubre de 2018 a las 9:11

  • cómo utilizar: medium.com/@hiteshkrsahu/…

    – Nick Kovalski

    10 de septiembre de 2020 a las 6:58

  • El uso de PixelCopy no es necesariamente “debería”. los documentos solo recomienda usarlo para el informe de comentarios de la interfaz de usuario y las pruebas unitarias.

    – mr5

    10 oct 2020 a las 13:20

Prueba esto:

    private fun convertViewToDrawable(view: View): Bitmap {
    val spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    view.measure(spec, spec)
    view.layout(0, 0, view.measuredWidth, view.measuredHeight)
    val b = Bitmap.createBitmap(view.measuredWidth, view.measuredHeight,
            Bitmap.Config.ARGB_8888)
    val c = Canvas(b)
    c.translate((-view.scrollX).toFloat(), (-view.scrollY).toFloat())
    view.draw(c)
    return b
}

codigo muy preciso..

private fun convertViewToDrawable(view: View): Bitmap {
        val b = Bitmap.createBitmap(view.measuredWidth, view.measuredHeight,
            Bitmap.Config.ARGB_8888)
        val c = Canvas(b)
        c.translate((-view.scrollX).toFloat(), (-view.scrollY).toFloat())
        view.draw(c)
        return b
    }

  • ¿Por qué la necesidad de traducir y desplazar los valores?

    – desarrollador de Android

    30 de julio de 2020 a las 19:06

Avatar de usuario de Vlad
Vlad

Algún otro código kotlin (caso ScrollView)

val ScrollView.bitmap: Bitmap
get() {
    val bitmap = Bitmap.createBitmap(width, getChildAt(0).height, Bitmap.Config.RGB_565)
    with(Canvas(bitmap)) {
        val background = background
        if (background != null) {
            background.draw(this)
        } else {
            drawColor(Color.WHITE)
        }
        draw(this)
    }
    return bitmap
}

  • ¿Por qué la necesidad de traducir y desplazar los valores?

    – desarrollador de Android

    30 de julio de 2020 a las 19:06

Avatar de usuario de Suraj Rao
Suraj Rao

bitmap = view.drawToBitmap()
val pixel = bitmap.getpixel(x,y)

  • Si bien este código puede resolver la pregunta, incluyendo una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resulte en más votos a favor. Recuerda que estás respondiendo la pregunta para lectores en el futuro, no solo para la persona que pregunta ahora. Edite su respuesta para agregar explicaciones y dar una indicación de las limitaciones y suposiciones que se aplican.

    – Yunnosch

    25 de mayo a las 5:52

¿Ha sido útil esta solución?