需求截图出如下长图片:
已经写成一个类可直接使用,直接上代码:
/**
* 项目名称:测试截屏
* 类描述:截屏
* 创建人:ZhaoGL
* 创建时间:2016/4/26 13:47
*/
public class ScreenShot {
private static String TAG = "ScreenShot";
/**
* 获取指定Activity的截屏,保存到png文件
* @param activity
* @return
*/
public static Bitmap takeScreenShot(Activity activity) {
// View是你需要截图的View
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
// 获取状态栏高度
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
System.out.println(statusBarHeight);
// 获取屏幕长和高
int width = activity.getWindowManager().getDefaultDisplay().getWidth();
int height = activity.getWindowManager().getDefaultDisplay()
.getHeight();
// 去掉标题栏
// Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
- statusBarHeight);
view.destroyDrawingCache();
savePic(b, "/sdcard/screen_test.png");
return b;
}
/**
* 保存到sdcard
* @param b
* @param strFileName
*/
public static void savePic(Bitmap b, String strFileName) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(strFileName);
if (null != fos) {
b.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 把View对象转换成bitmap
*
*/
public static Bitmap convertViewToBitmap(View view) {
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
public static Bitmap getViewBitmap(View v) {
v.clearFocus();
v.setPressed(false);
boolean willNotCache = v.willNotCacheDrawing();
v.setWillNotCacheDrawing(false);
int color = v.getDrawingCacheBackgroundColor();
v.setDrawingCacheBackgroundColor(0);
if (color != 0) {
v.destroyDrawingCache();
}
v.buildDrawingCache();
Bitmap cacheBitmap = v.getDrawingCache();
if (cacheBitmap == null) {
return null;
}
Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
v.destroyDrawingCache();
v.setWillNotCacheDrawing(willNotCache);
v.setDrawingCacheBackgroundColor(color);
return bitmap;
}
/**
* 截取scrollview的屏幕
*
*
*/
public static Bitmap getBitmapByView(ScrollView scrollView) {
int h = 0;
Bitmap bitmap = null;
// 获取listView实际高度
for (int i = 0; i < scrollView.getChildCount(); i++) {
h += scrollView.getChildAt(i).getHeight();
scrollView.getChildAt(i).setBackgroundColor(
Color.parseColor("#ffffff"));
}
Log.d(TAG, "实际高度:" + h);
Log.d(TAG, " 高度:" + scrollView.getHeight());
// 创建对应大小的bitmap
bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
scrollView.draw(canvas);
return bitmap;
}
/**
* ListView 截屏
* @param listView
* @param context
* @return
*/
public static Bitmap createBitmap(ListView listView, Context context){
int titleHeight,width, height, rootHeight=0;
Bitmap bitmap;
Canvas canvas;
int yPos = 0;
int listItemNum;
List childViews = null;
width = getDisplayMetrics(context)[0];//宽度等于屏幕宽
ListAdapter listAdapter = listView.getAdapter();
listItemNum = listAdapter.getCount();
childViews = new ArrayList(listItemNum);
View itemView;
//计算整体高度:
for(int pos=0; pos < listItemNum; ++pos){
itemView = listAdapter.getView(pos, null, listView);
//measure过程
itemView.measure(View.MeasureSpec.makeMeasureSpec(width, View. MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
childViews.add(itemView);
rootHeight += itemView.getMeasuredHeight();
}
height = rootHeight;
// 创建对应大小的bitmap
bitmap = Bitmap.createBitmap(listView.getWidth(), height,
Bitmap.Config.ARGB_8888);
//bitmap = BitmapUtil.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
Bitmap itemBitmap;
int childHeight;
//把每个ItemView生成图片,并画到背景画布上
for(int pos=0; pos < childViews.size(); ++pos){
itemView = childViews.get(pos);
childHeight = itemView.getMeasuredHeight();
itemBitmap = viewToBitmap(itemView,width,childHeight);
if(itemBitmap!=null){
canvas.drawBitmap(itemBitmap, 0, yPos, null);
}
yPos = childHeight +yPos;
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bitmap;
}
private static Bitmap viewToBitmap(View view, int viewWidth, int viewHeight){
view.layout(0, 0, viewWidth, viewHeight);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
/**
* 压缩图片
* @param image
* @return
*/
public static Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
while (baos.toByteArray().length / 1024 > 100) {
// 重置baos
baos.reset();
// 这里压缩options%,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, options, baos);
// 每次都减少10
options -= 10;
}
// 把压缩后的数据baos存放到ByteArrayInputStream中
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
// 把ByteArrayInputStream数据生成图片
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
return bitmap;
}
/**
* 获取屏幕分辨率
*
* @param context
* @return
*/
public static final Integer[] getDisplayMetrics(Context context) {
DisplayMetrics dm = new DisplayMetrics();
dm = context.getApplicationContext().getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
return new Integer[]{screenWidth, screenHeight};
}
/**
* 保存图片并插入图库
* @param context
* @param bmp
* @param dir 文件夹
*/
public static void saveImageToGallery(Context context, Bitmap bmp,String dir) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(), dir);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
String path = appDir + fileName;
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
}
}
调用方法很简单,下面放上例子:
例子代码下载