在Android API 28中不推荐使用view.getDrawingCache()

Mos*_*war 17 android screenshot bitmap

在android API 28中view.getDrawingCache()已被弃用.有没有更新的解决方案来生成Android中的特定视图的位图.

Ash*_*nki 19

  1. 使用画布
  2. 像素Api

Canvas Example

RelativeLayout view = (RelativeLayout)findViewById(R.id.relativelayout);
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Drawable bgDrawable = view.getBackground();
if (bgDrawable != null) {
    bgDrawable.draw(canvas);
} else {
    canvas.drawColor(Color.WHITE);
}
view.draw(canvas);
Run Code Online (Sandbox Code Playgroud)

PixelCopy Api

/sf/answers/3708988811/

更多

https://developer.android.com/reference/android/graphics/Bitmap

https://developer.android.com/reference/android/graphics/Canvas

  • 耶!Canvas方法第一次成功!F--- PixelCopy API! (2认同)

Mos*_*war 9

我找到了一种使用PixelCopy API将视图作为位图检索的方法。二手的科特林

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么Google总是必须使事情复杂化?我想要位图的时间与我以后不再使用回调调用该方法的时间相同。 (13认同)
  • 这是谷歌一直在做。:) (2认同)
  • @ TheRealChx101我今天发现了[this](/sf/answers/1356852451/),我将使用它。 (2认同)