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

1462 2025-10-14 05:15:08
一、不包含自定义控件 地图 SDK 支持对当前屏幕显示区域进行截屏,可以对地图、覆盖物(包含信息窗口)、Logo进行截取屏幕,这其中不包括地

一、不包含自定义控件

地图 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, 要显示的控件)

}

}

网站图片上传失败的排查与解决方法|俱字成语大全四个字(包含俱字的成语