Android 如何以编程方式拍摄/合并Google map v2的屏幕截图和xml的布局?
我正在使用下面的代码截图谷歌地图v2 这给了我输出: 拍摄地图的屏幕截图哪一个好 使用下面的代码,我可以用黑色的地图屏幕截图布局 这没关系,因为下面的代码映射将在屏幕截图中显示为黑色Android 如何以编程方式拍摄/合并Google map v2的屏幕截图和xml的布局?,android,screenshot,google-maps-android-api-2,Android,Screenshot,Google Maps Android Api 2,我正在使用下面的代码截图谷歌地图v2 这给了我输出: 拍摄地图的屏幕截图哪一个好 使用下面的代码,我可以用黑色的地图屏幕截图布局 这没关系,因为下面的代码映射将在屏幕截图中显示为黑色 String mPath = Environment.getExternalStorageDirectory().toString() + "/" + "myTestScr" + System.currentTimeMillis() + ".jpeg"; Bitmap bitmap
String mPath = Environment.getExternalStorageDirectory().toString()
+ "/" + "myTestScr" + System.currentTimeMillis() + ".jpeg";
Bitmap bitmap;
View v1 = (View) findViewById(R.id.rootviewtest);
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream fout = null;
File imageFile = new File(mPath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上述代码的输出:
我真正需要的是:
那么,现在我的问题是,如何以编程方式获得第三个屏幕中的输出
通过以编程方式合并(1和2)两个屏幕,帮助我拍摄一张屏幕截图
或者在拍摄完(1和2)个屏幕截图后,以编程方式合并两个图像的任何其他替代方法?我不知道Android API,但由于您要求使用“替代”方法,我建议您使用。在那个网站上有几个二进制文件,所以我希望你能下载一个适合你的系统。否则,您可以下载源代码(google around,您会找到许多关于为Android构建它的链接)
由于我在Windows机器上工作,我只能告诉您如何从Windows命令行调用它,但其他平台的语法类似。这个应用程序也有大量的API用于不同语言(java、C++或C++可能对你特别感兴趣),这样你就可以在你的应用程序中嵌入IMAGEMGIK而不是从命令行调用它。
现在来看手头的问题:您需要做的操作是在地图上放置带有符号的“覆盖表”,就像在真实地图上放置带有图形的透明表一样
因此,让我们调用要合并的两个文件map.png
和overlay.png
。请注意,覆盖文件也是一个PNG文件(稍后将对此进行详细介绍)。然后,您可以通过以下命令行调用获得与所需内容接近的内容:
composite.exe -compose atop overlay.png map.png output.jpg
为什么覆盖也必须是PNG图像?这是因为我们需要一个在大多数区域都是透明的“覆盖表”(除了有气球尖和其他图形的区域),但是JPG图像不存储透明度信息(它们没有存储此信息的alpha通道)
因此,您应该修改生成覆盖的代码部分,以便生成具有适当alpha通道的PNG图像
希望所有这些都能有所帮助。调用以下方法以获取地图截图:
public void captureMapScreen() {
SnapshotReadyCallback callback = new SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap snapshot) {
try {
mView.setDrawingCacheEnabled(true);
Bitmap backBitmap = mView.getDrawingCache();
Bitmap bmOverlay = Bitmap.createBitmap(
backBitmap.getWidth(), backBitmap.getHeight(),
backBitmap.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(snapshot, new Matrix(), null);
canvas.drawBitmap(backBitmap, 0, 0, null);
FileOutputStream out = new FileOutputStream(
Environment.getExternalStorageDirectory()
+ "/MapScreenShot"
+ System.currentTimeMillis() + ".png");
bmOverlay.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
}
};
mMap.snapshot(callback);
}
mview
是布局的根视图,mMap
是地图片段
确保您拥有最新的googleplay服务
API
mView.setDrawingCacheEnabled(true);
Bitmap backBitmap = mView.getDrawingCache();
Bitmap bmOverlay = Bitmap.createBitmap(
backBitmap.getWidth(), backBitmap.getHeight(),
backBitmap.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(snapshot, new Matrix(), null);
canvas.drawBitmap(backBitmap, 0, 0, null);
跳过这些行并使用snapshot.compress(Bitmap.CompressFormat.PNG,90,out)代码>如果您只想要地图的屏幕截图。请避免使用代码格式作为重点。
。该格式样式用于内联代码,而不是强调。请确保您使用的是android.graphics.Matrix
。而不是android.opengl.Matrix
在我更改了这两个canvas.drawBitmap(snapshot,new Matrix(),null)的顺序后,它对我有效;drawBitmap(backBitmap,0,0,null)onSnapshotReady(位图快照)
它在主线程上被调用吗?在我的例子中,我必须分别添加屏幕高度“getWindow().getWindowManager().getDefaultDisplay().getHeight();”和宽度“getWindow().getWindowManager().getDefaultDisplay().getWidth();”作为位图的高度和宽度。以防有人遇到同样的问题我正在使用这个方法,这是工作很好,采取屏幕截图的地图,但实际上我想在屏幕截图也标记,我没有得到标记在那个