Android高德地图截屏功能(可包含自定义控件)

Android高德地图截屏功能(可包含自定义控件)_第1张图片

一、不包含自定义控件

地图 SDK 支持对当前屏幕显示区域进行截屏,可以对地图、覆盖物(包含信息窗口)、Logo进行截取屏幕,这其中不包括地图控件、Toast窗口。

详细示例如下:

 // 对地图进行截屏
            aMap!!.getMapScreenShot(object : OnMapScreenShotListener {
                override fun onMapScreenShot(bitmap: Bitmap) {}
                override fun onMapScreenShot(bitmap: Bitmap, status: Int) {
                    try {
                        val fos = FileOutputStream(
                            (Environment.getExternalStorageDirectory()
                                .toString() + "/test_1") + ".png"
                        )
                        val b = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
                        try {
                            fos.flush()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }
                        try {
                            fos.close()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }
                        val buffer = StringBuffer()
                        if (b) buffer.append("截屏成功 ") else {
                            buffer.append("截屏失败 ")
                        }
                        if (status != 0) buffer.append("地图渲染完成,截屏无网格") else {
                            buffer.append("地图未渲染完成,截屏有网格")
                        }
                        ToastUtil.showShortToast(buffer.toString())
                    } catch (e: FileNotFoundException) {
                        e.printStackTrace()
                    }
                }
            })

二、包含自定义控件

object ScreenShotHelper {
    /**
     * 组装地图截图和其他View截图,并且将截图存储在本地sdcard,需要注意的是目前提供的方法限定为MapView与其他View在同一个ViewGroup下
     *
     * @param bitmap        地图截图回调返回的结果
     * @param viewContainer MapView和其他要截图的View所在的父容器ViewGroup
     * @param mapView       MapView控件
     * @param views         其他想要在截图中显示的控件
     */
    fun saveScreenShot(
        bitmap: Bitmap,
        viewContainer: ViewGroup,
        mapView: MapView,
        vararg views: View?
    ) {
        object : Thread() {
            override fun run() {
                val screenShotBitmap =
                    getMapAndViewScreenShot(bitmap, viewContainer, mapView, *views)
                if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
                    val file =
                        File(Environment.getExternalStorageDirectory().absolutePath + File.separator + "test1.png")
                    try {
                        val outputStream = FileOutputStream(file)
                        screenShotBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)

                        //根据自己需求,如果外边对bitmp还有别的需求就不要recycle的
                        screenShotBitmap.recycle()
                        bitmap.recycle()
                    } catch (e: FileNotFoundException) {
                        e.printStackTrace()
                    }
                }
            }
        }.start()
    }

    /**
     * 组装地图截图和其他View截图,需要注意的是目前提供的方法限定为MapView与其他View在同一个ViewGroup下
     *
     * @param bitmap        地图截图回调返回的结果
     * @param viewContainer MapView和其他要截图的View所在的父容器ViewGroup
     * @param mapView       MapView控件
     * @param views         其他想要在截图中显示的控件
     */
    fun getMapAndViewScreenShot(
        bitmap: Bitmap?,
        viewContainer: ViewGroup,
        mapView: MapView,
        vararg views: View?
    ): Bitmap {
        val width = viewContainer.width
        val height = viewContainer.height
        val screenBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(screenBitmap)
        canvas.drawBitmap(bitmap!!, mapView.left.toFloat(), mapView.top.toFloat(), null)
        for (view in views) {
            view!!.isDrawingCacheEnabled = true
            canvas.drawBitmap(view.drawingCache, view.left.toFloat(), view.top.toFloat(), null)
        }
        return screenBitmap
    }
}
使用方式
  aMap!!.getMapScreenShot(object : OnMapScreenShotListener {
                override fun onMapScreenShot(bitmap: Bitmap) {}
                override fun onMapScreenShot(bitmap: Bitmap, status: Int) {
       ScreenShotHelper.saveScreenShot(bitmap, 根布局, v!!.routeMapView, 要显示的控件)
    }
}

你可能感兴趣的:(android)