【问题标题】:How to take screenshot of WHOLE activity page programmatically? [closed]如何以编程方式截取整个活动页面的屏幕截图? [关闭]
【发布时间】:2015-02-23 08:59:03
【问题描述】:

如何在 Android 上截取整个活动的屏幕截图,即使内容不可见? 前任。把聊天全截图然后生成图片文件?

我也想要截图不可见区域。

谢谢

【问题讨论】:

  • 我尝试了 android ASL 库,但演示无法正常工作。 code.google.com/p/android-screenshot-library
  • 我什至不确定这在技术上是否可行
  • 这是有可能的,因为你的 Activity 是可见的。
  • @DerGolem:不一定。事实上,在一般情况下,对于合理的努力水平来说“不可能”是不切实际的。任何使用适配器模式(ListViewRecyclerViewViewPager 等)的东西都不适用于“经典”屏幕截图方法,因为目前并非所有适配器项都在 Views 中呈现。相反,您基本上必须通过手动单独渲染每个适配器项目并假装它们都在屏幕上来将自己的屏幕截图拼接在一起。你可能没有堆空间。
  • 为什么要截屏?对于“完整聊天”,我不会选择将输出保存为图像。我会使用 HTML,或者 PDF,这样文本仍然可以搜索、复制等。

标签: java android screenshot


【解决方案1】:

一种方法是提取当前屏幕的位图并保存。试试这个:

public void takeScreenshot(){
    Bitmap bitmap = getScreenBitmap(); // Get the bitmap
    saveTheBitmap(bitmap);               // Save it to the external storage device.
}

public Bitmap getScreenBitmap() {
   View v= findViewById(android.R.id.content).getRootView();
   v.setDrawingCacheEnabled(true); 
   v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
   v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

   v.buildDrawingCache(true);
   Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
   v.setDrawingCacheEnabled(false); // clear drawing cache
   return b;
}

Android take screen shot programmatically

【讨论】:

  • 谢谢,是的,它有效,但我需要完整活动的屏幕截图 - 不仅可见。 :)
  • 完整活动如?可以分享一下手机的截图和需要的截图内容吗?当前和其他在后台创建的完整活动?
  • 我已经编辑了我的问题,请看上面的图片,你会明白我需要什么:) thx
  • 请试试上面的代码。希望对您有所帮助。
  • 是的,它现在可以工作了 - 你是天才 - 非常感谢!!!
【解决方案2】:

这是获取视图“屏幕截图”的一种方式。我还没有测试过,所以看看它是否有效

//View v is the root view/parent of your layout, for example LinearLayout or RelativeLayout (layout where you have placed content of which you want to take screenshot)
private Bitmap getBitmapFromView(View v) {
    Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas (bitmap);
    v.draw(canvas);
    // Returns screenshot
    return bitmap;
}

【讨论】:

  • 感谢您的回答,是的,它有效,但我需要完整活动的屏幕截图 - 不仅可见.. 你明白了吗? :)
  • @Giorgi Asaturyan 将滚动视图设置为父视图。这样,即使内容不可见,您也可以截取屏幕截图。或者,如果您的内容在 ListView 内,您可以自动向下或向上滚动并截取多个屏幕截图,然后将它们全部组合成一个位图。这并不难。
  • 我马上试试,谢谢
  • Ive tried right now , but still it doesnt 为我工作 你能分享一些工作代码吗?谢谢
  • 发布你的代码,我看看我能做什么。
【解决方案3】:

公共类 MainActivity 扩展 Activity {

ImageView imageView = null;
ScrollView sv = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sv = (ScrollView) findViewById(R.id.ssscrollView);
    imageView = (ImageView) findViewById(R.id.imgView);
    Button myBtn = (Button) findViewById(R.id.btn);
    myBtn.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings("deprecation")
        @Override
        public void onClick(View v) {

            View v1 = sv.getRootView();
            v1.setDrawingCacheEnabled(true);
            Bitmap bm = getBitmapFromView(v1);
            @SuppressWarnings("deprecation")
            BitmapDrawable bitmapDrawable = new BitmapDrawable(bm);
            ImageView view2 = (ImageView) findViewById(R.id.imgView);
            view2.setBackgroundDrawable(bitmapDrawable);
        }
    });

}

private Bitmap getBitmapFromView(View v) {
    Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    v.draw(canvas);
    return bitmap;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多