在不同的资源文件中截取布局的屏幕截图
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();我试图删除该代码,只是为了检查,然后应用程序关闭了。 你能用你尝试过的方法更新你问题中的代码吗?以上是关于在不同的资源文件中截取布局的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章