在不同的资源文件中截取布局的屏幕截图

Posted

技术标签:

【中文标题】在不同的资源文件中截取布局的屏幕截图【英文标题】:Taking a screenshot of a layout in a different resource file 【发布时间】:2015-09-02 18:11:59 【问题描述】:

我正在尝试截取不同 XML 文件中的布局的屏幕截图,但不显示它。到目前为止,我可以截取当前活动的屏幕截图:

从我目前的活动:

public void takeScreenshot()

    View view = getWindow().getDecorView().getRootView();

    Bitmap bitmap = GLOBAL.viewToBitmap(view);

    String filename = "screenshot";
    String folder = "/Pictures";

    Boolean result = GLOBAL.saveBitmap(bitmap, filename, folder);
    String message;

    if(result)
        message = "Screenshot saved in folder " + folder;
    else
        message = "Error taking screenshot";
    

    Toast.makeText(this, message, Toast.LENGTH_LONG).show();

来自我的全球班级:

public Bitmap viewToBitmap(View view)

    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);

    return bitmap;


public Boolean saveBitmap(Bitmap bitmap, String filename, String folder)

    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + folder);
    myDir.mkdirs();

    File file = new File(myDir, filename + ".png");
    if (file.exists())
        file.delete();
    try 
        FileOutputStream out = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
        out.close();
     catch (Exception e) 
        e.printStackTrace();
        return false;
    
    return true;

现在我正在尝试更改我的 takeScreenshot() 方法,如下所示:

public void takeScreenshot()
    LayoutInflater inflater;
    inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflater.inflate(R.layout.screenshot_layout, null);

    Bitmap bitmap = GLOBAL.viewToBitmap(view);

    String filename = "screenshot";
    String folder = "/Pictures";

    Boolean result = GLOBAL.saveBitmap(bitmap, filename, folder);
    String message;

    if(result)
        message = "Screenshot saved in folder " + folder;
    else
        message = "Error taking screenshot";
    

    Toast.makeText(this, message, Toast.LENGTH_LONG).show();

...但是应用程序在第一个类似 viewToBitmap() 时崩溃,我在调试时得到以下信息:

Caused by: java.lang.IllegalArgumentException: width and height must be > 0

我尝试给我的布局文件中的根 LinearLayout 一个固定的高度和宽度,然后“wrap_content”和一些具有固定尺寸的子元素,所以高度和宽度都应该大于 0。那么我怎样才能正确地得到布局的视图?

提前致谢。

【问题讨论】:

【参考方案1】:

我在下面的代码中没有看到任何地方

   View view = getWindow().getDecorView().getRootView();
   view.setDrawingCacheEnabled(true);
   view.getDrawingCache();

请访问Screen Capture in android 或How to programatically take a screenshot on Android? 获取更多帮助。

为您的隐藏布局提供 id 并尝试这样

   View view = findViewById(R.id.screenshot_layout).getRootView();
   view.setDrawingCacheEnabled(true);
   view.getDrawingCache();

现在就这样试试

    view.getDrawingCache();
    view.post(new Runnable() 
    @Override
    public void run() 
        // do coding here to save screen shot
    
   );

【讨论】:

但这不是从当前活动中截取屏幕截图吗?我已经这样做了。我现在要做的是捕获另一种布局的图像,用户看不到。 我在我的布局文件中给了父LinearLayout一个ID,并按照你的建议做了,但我仍然得到同样的错误(宽度和高度必须大于0)。 我已经更新了答案。访问此处获取更多帮助。 ***.com/a/17745162/5202007 还是不行。此时会抛出错误:view.setDrawingCacheEnabled(true); view.getDrawingCache();我试图删除该代码,只是为了检查,然后应用程序关闭了。 你能用你尝试过的方法更新你问题中的代码吗?

以上是关于在不同的资源文件中截取布局的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

如何截取完整滚动文件的屏幕截图

在 Silverlight 3 中截取当前用户控件或任何 GUI 的屏幕截图

视图的屏幕截图与视图的大小不同?

在 Android 中拍摄特定布局的“屏幕截图”

在 setContentView 上找不到资源异常

如何使用 php 截取已加载网页的屏幕截图? [复制]