Here is a brief explanation on how to save part of screen as an image – taking screenshot programmatically !
Example :
To do this:
Step 1 :
First identify the layout whose contents are to be saved as image and assign it to a view.
If there are lot many objects, easier is to use a frame layout
memecontentView = findViewById(R.id.frame_memecontent); View v = memecontentView;
Step 2 :
Manually generate a bitmap copy of the view
Manually generate a bitmap copy of the view
v1.setDrawingCacheEnabled(true);
Step 3 : For the generated bitmap, we need to set layout , else a bitmap of (0,0) will be generated and you won't be able to see it. Setting up a layout is a two pass process : a measure pass and a layout pass.
Measure Pass : For deciding dimension specifications for view
v1.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
Layout Pass : During this pass, each parent is responsible for positioning all of its children using the sizes computed in the measure pass
v1.layout(0, 0, v1.getMeasuredWidth(), v1.getMeasuredHeight());
More Details on measure and layout pass here.
Step 4 : Force the drawing cache to be built :
v1.buildDrawingCache(true);
If we are calling this manually, we need to clean this up afterwards using destroyDrawingCache();
So this was initial preparation needed for taking the screenshot.
Step 5 : Now to take screenshot and save in sdcard :
a.) Retrieve the view to be saved using :
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.) Compress the bitmap and use 100 as factor for maintaining the quality. If you can compromise with quality, reduce the factor
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
c.) Save in sdcard
f = new File(DATA_PATH + File.separator + value);
try {
f.createNewFile();
// write the bytes in file
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(getApplicationContext(),"Image Saved at " + f.getPath(), Toast.LENGTH_SHORT).show();
d.) Destroy the cache
v1.destroyDrawingCache();
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical"
android:padding="2dp" >
<RelativeLayout
android:id="@+id/relativeLayout_titleBar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.1"
android:background="#4795D2" >
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:gravity="center"
android:text="Screenshot App"
android:textColor="#FFFFFF"
android:textSize="20sp" />
<ImageView
android:id="@+id/imageView_settingsTextColor"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:src="@drawable/action_settings" />
</RelativeLayout>
<EditText
android:id="@+id/editText_meme"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="5dp"
android:layout_weight="0.1"
android:background="@drawable/rounded_rect"
android:hint="your text here"
android:imeOptions="actionDone"
android:singleLine="true" />
<FrameLayout
android:id="@+id/frame_memecontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="5dp"
android:layout_weight="0.7"
android:background="@drawable/rounded_rect" >
<ImageView
android:id="@+id/frame_backgroundImage1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/defaultbackground" />
<ImageView
android:id="@+id/imageview_sita"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="matrix"
/>
<TextView
android:id="@+id/frame_textContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="Taking Screenshot"
android:textColor="#1c86ee"
android:textColorHint="@android:color/darker_gray"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.1"
android:orientation="horizontal"
android:weightSum="2" >
<Button
android:id="@+id/button_changeBackgroundImage"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#4795D2"
android:text="Change Background"
android:textColor="#FFFFFF" />
<Button
android:id="@+id/button_saveImage"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#4795D2"
android:text="Save / Share"
android:textColor="#FFFFFF" />
</LinearLayout>
</LinearLayout>
Cheers,
~Divya

No comments:
Post a Comment
Would love to hear from you. Leave a comment :)