Taking a “screenshot” of a specific layout in Android

后端 未结 6 2010
天命终不由人
天命终不由人 2020-11-30 03:26

I have two main issues which are closely linked. I am looking at these problems from a programmatic point of view.

(1) - I wish to take a screenshot of the

相关标签:
6条回答
  • 2020-11-30 03:54

    EDIT : after seeing OP's comment

    You dont need to think about new activities at all.. Say you are in Activity right now.. Layout A is the main layout for the activity, Layout B and C are two child layouts inside Layout A. Like this,

     Layout A -> Parent
     |
      -------Layout B
     |
      -------Layout C
    

    Now if you want to take screenshot of C only

    1) in onCreate() of activity

     LinearLayout myCLayout = (LinearLayout)this.findViewbyId(R.id.my_c_layout);
     ViewTreeObserver vto   =  myCLayout.getViewTreeObserver();
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
       @Override
       public void onGlobalLayout() {
          //fully drawn, no need of listener anymore
          myCLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
          getDrawingBitmap();
       }
     });
    

    where getDrawingBitmap() is a function..to take your screenshot..

    public void getDrawingBitmap(){
        LinearLayout myCLayout = (LinearLayout)this.findViewbyId(R.id.my_c_layout);
        Bitmap b = myCLayout.getDrawingCache();
    
        File file = saveBitmapAsFile(b);
    }
    

    EDIT: For ScrollView

    I never tried it.. But I think you can do this..

    1) first override scrollView, and override onMeasure function..

    public class MyScrollView extends ScrollView{
        public MyScrollView(Context context, AttributeSet attrs) {
             super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
            super.onMeasure(widthMeasureSpec, yourFullScrollViewHeight));
        }
    }
    

    and use MyScrollView in your layout.. here yourFullScrollViewHeight is the height of all scrollView content you need to take screenshot of.. I never tried this.. But it might work..

    0 讨论(0)
  • 2020-11-30 03:58

    Thanks to you guys, I've finally found out what was wrong.

    View v = view.getRootView(); should not be used because it will call the root view which I do not want. I mistakenly thought this did not make a difference because I had entered the wrong resource ID.

    MeasureSpec somehow did not give a good account of the width and height. So I ended up using another method:

    ...
    ScrollView z = (ScrollView) findViewById(R.id.scroll);
    int totalHeight = z.getChildAt(0).getHeight();
    int totalWidth = z.getChildAt(0).getWidth();
    u.layout(0, 0, totalWidth, totalHeight);
    ...
    

    As ScrollView's total height can be determined by the single child element that it has.

    After making these changes, I am now able to take a screenshot of a nested ScrollView and all its contents, visible or not. For anyone interested, here is the block of code including the saving of the bitmap:

                View u = findViewById(R.id.scroll);
                u.setDrawingCacheEnabled(true);                                                
                ScrollView z = (ScrollView) findViewById(R.id.scroll);
                int totalHeight = z.getChildAt(0).getHeight();
                int totalWidth = z.getChildAt(0).getWidth();
                u.layout(0, 0, totalWidth, totalHeight);    
                u.buildDrawingCache(true);
                Bitmap b = Bitmap.createBitmap(u.getDrawingCache());             
                u.setDrawingCacheEnabled(false);
    
                //Save bitmap
                String extr = Environment.getExternalStorageDirectory().toString() +   File.separator + "Folder";
                String fileName = new SimpleDateFormat("yyyyMMddhhmm'_report.jpg'").format(new Date());
                File myPath = new File(extr, fileName);
                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream(myPath);
                    b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                    fos.flush();
                    fos.close();
                    MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen");
                }catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
    0 讨论(0)
  • 2020-11-30 04:05

    I also had this problem and coded it myself.

    I used this code to take screenshot of whole layout.

    I did modified the list size and some mathematical items.

    See the following website,

    0 讨论(0)
  • 2020-11-30 04:07

    Here is the exact solution you want, It will display entire screen including content hidden in your ScrollView

    LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
    FrameLayout root = (FrameLayout) inflater.inflate(R.layout.activity_main, null); // activity_main is UI(xml) file we used in our Activity class. FrameLayout is root view of my UI(xml) file.
    root.setDrawingCacheEnabled(true);
    Bitmap bitmap = getBitmapFromView(this.getWindow().findViewById(R.id.frameLayout)); // here give id of our root layout (here its my FrameLayout's id)
    

    Display bitmap in your ImageView or use it as you want.
    Enjoy..

    0 讨论(0)
  • 2020-11-30 04:09

    Try this code

    public Bitmap screenShot(View view) {

        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
        view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        return bitmap;
    }
    
    0 讨论(0)
  • 2020-11-30 04:15

    try this it works fine for me

    TableLayout tabLayout = (TableLayout) findViewById(R.id.allview);
    if (tabLayout != null) {
        Bitmap image = Bitmap.createBitmap(tabLayout.getWidth(),
                tabLayout.getHeight(), Config.ARGB_8888);
        Canvas b = new Canvas(image);
        tabLayout.draw(b);
    }
    
    0 讨论(0)
提交回复
热议问题