Taking a "screenshot" of a specific layout in Android
android, screenshot
Solution
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();
}
Problem
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 contents of a SPECIFIC layout, i.e. a `ScrollView` nested in a `LinearLayout`. (2) - As the `ScrollView` has content that spills out of the screen (hence scrolling made possible), how can I ensure that the screenshot includes the elements that are not visible on the screen? This is the current block of code I use. It does the job of taking a screenshot but only for the entire screen. This is even though `R.id.boss` is the ID of the `ScrollView` and not the main `LinearLayout`. ``` View view = findViewById(R.id.boss); View v = view.getRootView();// this does not seem to make a difference 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(u.getDrawingCache()); v.setDrawingCacheEnabled(false); ``` Thanks in advance. EDIT: I've made a few mistakes. I used `R.id.boss` which is the wrong resource. I am now able to take a screenshot of the scrollview alone, less the out-of-screen parts. ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/boss" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="top" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="F" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Analyze via image URL" android:textAppearance="?android:attr/textAppearanceSmall" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/mUrl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.7" android:text="http://" > <requestFocus /> </EditText> <ImageView android:id="@+id/call" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.3" android:text="ABC" android:src="@drawable/run" /> </LinearLayout> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ABC" android:textAppearance="?android:attr/textAppearanceSmall" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/filepath" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.55" /> <ImageView android:id="@+id/cam" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.15" android:src="@drawable/cam" /> <ImageView android:id="@+id/browse" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.15" android:src="@drawable/folder" android:text="B" /> <ImageView android:id="@+id/upload" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.15" android:src="@drawable/run" android:text="A" /> </LinearLayout> <LinearLayout android:id="@+id/baba" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ScrollView android:id="@+id/scroll" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_weight="0.7" > <LinearLayout android:layout_width="fill_parent" android:layout_height="186dp" android:orientation="vertical" > <ImageView android:id="@+id/pic" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Facial recognition" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/avmarwe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Gender and age" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/skahasd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Expression and mood" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/dsfsfs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Celebrity Facial Match" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> </ScrollView> </LinearLayout> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" > <Button android:id="@+id/c" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_weight="0.7" android:text="" /> <Button android:id="@+id/share" android:layout_width="70dp" android:layout_height="50dp" android:layout_weight="0.3" android:text="" /> </LinearLayout> </LinearLayout> ```