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.
view.getDrawingCache() ist in Android API 28 veraltet
Mostafa Monowar
Ashvin solanki
Zwei Möglichkeiten, um eine Bitmap der Ansicht zu erhalten
- Leinwand verwenden
- 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
-
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
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()
}
}
}
-
-
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
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
-
-
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
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
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