android屏幕截图的截图

我正在研究一个Android应用程序。 我有一个活动,说A,它充满整个屏幕的意见..在AIbutton点击要启动另一个活动,说B,这也有一些意见和控制。 我想让活动B在屏幕外,并想从A中截取B的屏幕截图。 可能吗?

注意:通过将graphicscaching保存到位图中,我成功地获取了页面A的屏幕截图,但是仍然努力采取离屏页面的屏幕截图。

是的,这是可能的…你应该在活动“A”中扩展ActivityGroup。 然后在button单击事件中执行此操作…

View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView(); 

然后将该视图转换为位图…

我觉得这对你有帮助

那么我已经达到了我想要的。 这些是我使用的步骤。

  1. 用startActivityForResult()而不是startActivity()来启动活动B.

     Intent bIntent = new Intent(A.this,B.class); startActivityForResult(bIntent,B_REQUEST_CODE); 
  2. 在活动B的onCreate中取B的mainLayout并启用其绘图caching

     final LinearLayout layout = (LinearLayout) findViewById(R.id.app_parent_layout); layout.setDrawingCacheEnabled(true); layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH); 
  3. 在活动B中等待,直到其布局完全被绘制(这是非常重要的)。 对于活动B的onCreate(),获取B的mainLayout,使用ViewTreeObserver在其布局完全绘制时得到callback。

     ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); getDrawingBitmap(); } }); 
  4. 现在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(); } 

    在这里,我正在采取位图并将其保存为一个文件,并返回文件名作为结果代码。 我相信有更好的方法将位图发送到父活动比保存为文件和发送文件名。 但是我有一个需要保存位图一段时间。 所以对我来说这是更简单的方法。 设置结果完成活动后。

  5. 现在在活动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); } } } 

我认为这样做是非常困难的,因为我不知道如何控制这些视图的绘制方法,android操作系统也不会绘制它们,除非可见。

但是,可能只需要很短的时间就可以将其他View的前景填充到绘图caching中。 也许它可以被放在背景之前,甚至变得可见,至于顺利的经验,操作系统似乎在屏幕之前,其实际上是前景画。

另一个技巧可能是将您的前景视图作为子视图附加到背景上,并给它一个非常轻微的阿尔法透明度。 例如,WebView可以很好地叠加,实际上是强制WebView及其背景被绘制。 也许这也适用于其他视图。

即时通讯使用这种方式,它的工作很好,但有一个问题,即时拍摄一个布局的快照,当我采取拍照它给了我正确的图片,但经过一些改变后,我再次采取了它,让我以前的快照。

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