Android 如何以编程方式拍摄/合并Google map v2的屏幕截图和xml的布局?

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

我正在使用下面的代码截图谷歌地图v2 这给了我输出:

拍摄地图的屏幕截图哪一个好

使用下面的代码,我可以用黑色的地图屏幕截图布局 这没关系,因为下面的代码映射将在屏幕截图中显示为黑色

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();”作为位图的高度和宽度。以防有人遇到同样的问题我正在使用这个方法,这是工作很好,采取屏幕截图的地图,但实际上我想在屏幕截图也标记,我没有得到标记在那个