Taking a “screenshot” of a specific layout in Android

后端 未结 6 2013
天命终不由人
天命终不由人 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: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();
                }
    

提交回复
热议问题