我正在开发一款Android应用程序。我有一个填满整个屏幕的活动(Activity A),其中包含一些视图。当在A中点击按钮时,我想启动另一个活动(Activity B),它也有一些视图和控件。我希望Activity B处于屏幕外,并且想从A中获取B的截图。这是否可行?
注意:我已成功地通过将绘制缓存保存到位图中来获取页面A的截图,但是无法获取屏幕外页面的截图。
我正在开发一款Android应用程序。我有一个填满整个屏幕的活动(Activity A),其中包含一些视图。当在A中点击按钮时,我想启动另一个活动(Activity B),它也有一些视图和控件。我希望Activity B处于屏幕外,并且想从A中获取B的截图。这是否可行?
注意:我已成功地通过将绘制缓存保存到位图中来获取页面A的截图,但是无法获取屏幕外页面的截图。
是的,这是可能的...你应该在Activity 'A'中扩展ActivityGroup。 然后在你的按钮点击事件中执行以下操作...
View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
然后将该视图转换为位图...
我认为这对您有帮助...
好的,我已经达到了我的目标。这是我所采用的步骤。
Start activity B with startActivityForResult() instead of startActivity().
Intent bIntent = new Intent(A.this,B.class);
startActivityForResult(bIntent,B_REQUEST_CODE);
In onCreate of activity B take mainLayout of B and enable its drawing cache
final LinearLayout layout = (LinearLayout)
findViewById(R.id.app_parent_layout);
layout.setDrawingCacheEnabled(true);
layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
In activity B wait till its layout is drawn completely(This is very important). For that in onCreate() of activity B, get mainLayout of B, use ViewTreeObserver to get a call back when its layout is drawn completely.
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
getDrawingBitmap();
}
});
Now getDrawingBitmap() gets called when layout is drawn completely. There take your screenshot.
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();
}
Here I am taking bitmap and saving it as a file and returning the filename as a result code. I am sure there are better method to send the bitmap to parent activity than saving as a file and sending filename. But I have a requirement anyway to save bitmap for sometime. So For me this is the easier method. After setting result finish activity.
Now on Activity A onActivityResult() retrieve the filename.
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);
}
}
}
我认为这很难做到,因为我不知道如何控制这些视图的绘制方法,而且安卓操作系统也不会绘制它们,除非它们可见。
然而,可能有可能将其他视图置于前景,仅在短时间内填充其绘图缓存。也许可以在它变得可见之前再次将其放回背景,因为为了流畅的体验,操作系统似乎会在实际组合到前景之前绘制屏幕外的视图。
另一个技巧是将前景视图作为子视图附加到背景上,并给它一个非常轻微的透明度。例如,WebView 可以通过这种方式很好地叠加,实际上强制 WebView 及其背景都被绘制。也许这对其他视图也有效。
onDraw(Canvas)
方法,因为操作系统无法知道onDraw
实际绘制在Canvas上的位置。因此,具有一些onDraw方法的用户定义的视图将进行绘制。但是,具有UI元素的布局视图不必这样做:每个UI元素本身都是一个视图,并且如果系统未假定其可见,则可以将其排除在外。 - dronusinvalidate()
后使用自己的Canvas来绘制视图,从而自己绘制视图。 - dronus我正在使用这种方法,它运行得很好,但是有一个问题。第一次我只拍摄一个布局的快照,当我拍摄快照时,它给我正确的图片,但是在进行了一些更改后再次拍摄时,它会给我以前的快照。
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();
}