我正在开发一个Android应用程序。我有一个活动,比如A,它用整个屏幕填充视图。点击A中的一个按钮,我想开始另一个活动,比如B,它也有一些视图和控件。我希望活动B在屏幕外,并希望从A获取B的屏幕截图。可能吗?
注意:通过将绘图缓存保存到位图中,我成功获取了页面A的屏幕截图,但很难获取屏幕外页面的截图。
答案 0 :(得分:14)
是的,有可能......你应该在Activity'A'中扩展ActivityGroup。 然后在按钮点击事件中执行此操作...
View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
然后将该视图转换为位图...
我认为这对你有帮助......
答案 1 :(得分:5)
我已经达到了我想要的水平。这些是我使用的步骤。
使用startActivityForResult()而不是使用startActivityForResult()启动活动B. startActivity()。
Intent bIntent = new Intent(A.this,B.class);
startActivityForResult(bIntent,B_REQUEST_CODE);
在活动B的onCreate中,取B的mainLayout并启用它 绘图缓存
final LinearLayout layout = (LinearLayout)
findViewById(R.id.app_parent_layout);
layout.setDrawingCacheEnabled(true);
layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
在活动B中等待其布局完全绘制(这是非常的 重要)。对于活动B的onCreate(),获取mainLayout B,使用ViewTreeObserver在绘制布局时获取回调 完全。
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
getDrawingBitmap();
}
});
现在,在完全绘制布局时会调用getDrawingBitmap()。 截取你的截图。
public void getDrawingBitmap(){
LinearLayout mainLayout = (LinearLayout)
findViewById(R.id.app_parent_layout);
Bitmap b = mainLayout.getDrawingCache();
File file = saveBitmapAsFile(b);
Intent resultIntent = new Intent();
resultIntent.putExtra("FullFileName",file.getAbsolutePath());
setResult(Activity.RESULT_OK,resultIntent);
finish();
}
这里我正在使用位图并将其保存为文件并返回 filename作为结果代码。我相信有更好的发送方法 父节点的位图比保存为文件和发送 文件名。但我还是要求保存位图 一段时间。所以对我来说这是更简单的方法。设定结果后 完成活动。
现在,在活动A上,onActivityResult()检索文件名。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == B_REQUEST_CODE){
if (resultCode == Activity.RESULT_OK) {
String newText = data.getStringExtra("FullFileName");
File dir = new File (newText);
}
}
}
答案 2 :(得分:1)
我认为这样做很难,因为我知道无法控制这些视图的绘图方法,并且除非可见,否则Android操作系统不会绘制它们。
但是,有可能只在很短的时间内将其他视图前景化以填充其绘图缓存。也许它可以在它变得可见之前再次放入背景,因为在平滑的体验中,操作系统似乎在它们实际组成前景之前在屏幕外绘制视图。
另一个技巧可能是将您的前景视图作为子视图附加到背景上,并为其提供非常轻微的Alpha透明度。例如,WebView可以很好地叠加,实际上强制绘制WebView及其背景。也许这也适用于其他观点。
答案 3 :(得分:0)
即时通讯使用这种方式它工作得很好,但有一个问题,我只是第一次拍摄一个布局的快照,当我采取快照,它给了我正确的照片,但经过一些更改,我再次采取它,它给了我以前的快照。
RelativeLayout layout = (RelativeLayout)findViewById(R.id.mainview);
layout.setDrawingCacheEnabled(true);
layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
layout.buildDrawingCache();
Bitmap bitmap = layout.getDrawingCache();
File file = new File(Environment.getExternalStorageDirectory().toString() + "/sPenimg.png");
FileOutputStream ostream;
try {
ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, ostream);
ostream.flush();
ostream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
此问题已解决添加 ((RelativeLayout的)findViewById(R.id.mainview))destroyDrawingCache();