Android控件自带View缓存功能
首先
v.getRootView() == getWindow().getDecorView()//return true
rootView.setDrawingCacheEnabled(true);//设置允许缓存
view.buildDrawingCache();//创建缓存
Bitmap bitmap = view.getDrawingCache();//获取缓存
但是,此时通过得到rootview可以得到bitmap ,但是通过某个控件获取比如scrollview 可能bitmap返回null (google允许缓存最大cache为屏幕像素width * height * 4,超过不构建)
slove
通过限定宽高(局限是无法得到长图)
view.measure(View.MeasureSpec.makeMeasureSpec(
0,View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(
0,View.MeasueSpec.UNSPECIFIED));
// view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());//设置摆放宽高
通过view.draw()来绘制到画布保存图片(此时长图就可以得到啦~~🌶)
public Bitmap loadBitmapFromView(View v, boolean isParemt) {
if (v == null) {
return null;
}
Bitmap screenshot;
screenshot = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(screenshot);
// c.translate(-v.getScrollX(), -v.getScrollY()); //添加截取当前位置开始
v.draw(c);
return screenshot;
}
最后保存图片
private boolean saveBitmap(Bitmap bitmap, String name) {
File file = new File(FileUtils.DEFAULT_PHOTODIR, name + ".jpg");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
boolean isCreated = file.createNewFile();
Log.e("file", isCreated ? "创建成功" : "create fail");
FileOutputStream fos = new FileOutputStream(file);
boolean compress = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
Log.e("file", compress + "图片保存结果");
fos.flush();
fos.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
长图大功告成!
···系统命令截图
调用系统截图
需要cmd指令 adb shell screencap -p storage/emulated/0/DCIM/Camera/testView.jpg(调用此命令时,系统自动截取当前屏幕,app调用需要系统权限)
Runtime. getRuntime().exec("screencap -p " + mSavedPath); //不过app获取系统cmd权限非常麻烦