-
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权限非常麻烦