view.getDrawingCache() ist in Android API 28 veraltet

Lesezeit: 5 Minuten

Benutzeravatar von Mostafa Monowar
Mostafa Monowar

In der Android-API 28 view.getDrawingCache() ist veraltet. Gibt es eine neuere Lösung, um eine Bitmap einer bestimmten Ansicht in Android zu generieren.

Benutzeravatar von Ashvin solanki
Ashvin solanki

Zwei Möglichkeiten, um eine Bitmap der Ansicht zu erhalten

  1. Leinwand verwenden
  2. Verwenden von Pixel-API

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()
        }
    }
}

Weitere Informationen finden Sie unter Über

Bitmaps

Leinwand

  • Wie bekomme ich einen Teil der Ansicht? createBitmap scheint nur Breite und Höhe zu nehmen und sucht nach x,y,Breite,Höhe

    – Alex

    22. Februar 2019 um 16:40 Uhr

  • @Alex Benutzer das Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)

    – Ashvin solanki

    23. Februar 2019 um 4:54 Uhr


  • und wie bekommt man jetzt quelle. Bcz view.getDrawingCache() ist veraltet, was Bitmap zurückgegeben hat.

    – Alex

    23. Februar 2019 um 20:51 Uhr


  • @Alex verwenden Sie zuerst diese Methode, um eine Bitmap der Ansicht zu erhalten, die Sie nach Bedarf ändern können

    – Ashvin solanki

    24. Februar 2019 um 12:47 Uhr

Benutzeravatar von Mostafa Monowar
Mostafa Monowar

Ich habe eine Möglichkeit gefunden, die PixelCopy-API zum Abrufen der Ansicht als Bitmap zu verwenden. Benutzte 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()
        }
    }
}

  • Ref

    – daka

    3. Februar 2019 um 16:00 Uhr


  • Warum muss Google die Dinge immer verkomplizieren? Ich möchte, dass die Bitmap zur gleichen Zeit aufgerufen wird, zu der ich die Methode nicht später in der Zukunft mithilfe von Rückrufen aufrufe.

    – TheRealChx101

    10. Februar 2019 um 13:03 Uhr

  • @ TheRealChx101 Ich habe das heute gefunden, das ich stattdessen verwenden werde.

    – daka

    15. Februar 2019 um 23:30 Uhr

  • PixelCopy erfordert API Level 26 und höher. Wenn Sie Kompatibilität wünschen, verwenden Sie für ältere API-Ebenen die von @daka veröffentlichte Lösung.

    – Morgan Koh

    12. März 2019 um 8:02 Uhr


  • @daka kannst du verwenden Verknüpfung diese Bibliothek. Es behandelt alle Dinge zum Speichern eines Bildes einer Ansicht.

    – Mostafa Monowar

    12. März 2019 um 10:56 Uhr

Benutzeravatar von Antonio Vlasic
Antonio Vlasic

Laut offizieller Dokumentation getDrawingCache() Sie sollten die verwenden PixelKopie API.

  • Muss ich SurfaceView verwenden, um PixelCopy() zu verwenden. Denn in der Android-Dokumentation heißt es “Pixelkopieranforderungen, um Kopiervorgänge von Surface nach Bitmap zu ermöglichen”.

    – Mostafa Monowar

    4. Oktober 2018 um 10:02 Uhr

  • Fügen Sie ein Beispiel für pixelCopy() hinzu, um die Bitmap der Ansicht zu erfassen

    – Ashvin solanki

    20. Oktober 2018 um 12:28 Uhr


  • @Ashvinsolanki, bitte schau dir meine Antwort an. Es funktioniert weiter.

    – Mostafa Monowar

    25. Oktober 2018 um 9:11 Uhr

  • wie benutzt man: medium.com/@hiteshkrsahu/…

    – Nick Kovalsky

    10. September 2020 um 6:58 Uhr

  • Der Einsatz von PixelCopy ist nicht unbedingt “soll”. Das Dokumente empfiehlt nur die Verwendung für UI-Feedbackberichte und Einheitentests.

    – mr5

    10. Oktober 2020 um 13:20 Uhr

Versuche dies:

    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
}

sehr genauer Code..

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
    }

  • Warum die Notwendigkeit, Werte zu übersetzen und zu scrollen?

    – Android-Entwickler

    30. Juli 2020 um 19:06 Uhr

Vlads Benutzeravatar
Vlad

Ein anderer Kotlin-Code (ScrollView-Fall)

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
}

  • Warum die Notwendigkeit, Werte zu übersetzen und zu scrollen?

    – Android-Entwickler

    30. Juli 2020 um 19:06 Uhr

Benutzeravatar von Suraj Rao
Suraj Rao

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

  • Während dieser Code die Frage lösen kann, inklusive Erklärung wie und warum dies das Problem löst, würde wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie die Frage für zukünftige Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und einen Hinweis darauf zu geben, welche Einschränkungen und Annahmen gelten.

    – Yunnosch

    25. Mai um 5:52 Uhr

1431640cookie-checkview.getDrawingCache() ist in Android API 28 veraltet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy