阅读更多

将View生成相应的图片是很容易的,所以app内截图可以采用此种方式。

view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap screenshot = view.getDrawingCache();//使用完图片之后再执行destroyDrawingCache,因为destroyDrawingCache内部会调用bitmap.recycle()view.destroyDrawingCache();view.setDrawingCacheEnabled(false);

拿到了bitmap之后,还需要对其进行处理,分为下面几个部分/几种情况:

1.状态栏

2.导航栏

3.魅族flyme的smartbar

 

对于状态栏,app是无法截图的,截出来只是状态栏底色,上面的通知和时间电量等信息是没有的,所以一般会去掉状态栏这一块

对于导航栏,这个是可以截到的,但是内容和app无关,只是3个按钮,可能也不好看,所以一般也会去掉

另外,魅族还有smartbar,一般也需要干掉

对于上面3条,我们只需要得知其高度即可,然后去除这几部分(这里没有考虑横屏)

//width为截图宽度,height为最终的图片高度,即处理过状态栏/导航栏/smartbar之后的高度//top为状态栏的高度Bitmap bg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bg);canvas.drawBitmap(screenshot, width, top, null);screenshot.recycle();

 

下面是对于魅族的flyme特殊处理的部分

判断flyme系统

/** * 判断是否是魅族系统 * @return */public static boolean isFlyme() {    try {        // Invoke Build.hasSmartBar()        final Method method = Build.class.getMethod("hasSmartBar");        return method != null;    } catch (final Exception e) {        return false;    }}

获取smartbar高度

//获取魅族smartbar高度public static int getSmartBarHeight(Context context) {    try {        Class clazz = Class.forName("com.android.internal.R$dimen");        Object obj = clazz.newInstance();        Field field = clazz.getField("mz_action_button_min_height");        int height = Integer.parseInt(field.get(obj).toString());        return context.getResources().getDimensionPixelSize(height);    } catch (ClassNotFoundException e) {        Log.w(TAG, e);    } catch (InstantiationException e) {        Log.w(TAG, e);    } catch (IllegalAccessException e) {        Log.w(TAG, e);    } catch (NoSuchFieldException e) {        Log.w(TAG, e);    }    return 0;}

如何获取状态栏/导航栏高度这里不再赘述

 

 

上面说的是一般情况,下面我们来说说几种特殊情况

1.如何截取dialog

如果直接在activity获取window中的DecorView,截取的图片实际是没有dialog部分的,只有dialog下面的页面。想要获取dialog截图,我们可以先获取dialog引用,然后获取

dialog.getWindow().getDecorView()

2.当页面没有占满屏幕时

举个例子,有的时候我们会把页面做成半窗形式,屏幕上方还能看到上一个页面的内容。这时activity只有屏幕下方那部分,所以这时处理截图时不能再减去状态栏那部分了,因为此时截图上面根本没有状态栏

3.webview截图

在4.3系统上面,使用getDecorView().getDrawingCache()方法有时不能准确的截取webview上面显示的内容。当webview里显示tab形式的页面时,有时不管当前处于哪个tab,截图出来的都是第一个tab的内容。

但是,如果使用webview.getDrawingCache(),那么是能得到正确的图片的,所以我在含有webview的页面中截图方式是遍历页面中的view,然后将图片拼到一起

 

更多相关文章

  1. 安全新手入坑——HTML标签
  2. Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
  3. Android(安卓)三种方式实现自定义圆形页面加载中效果的进度条
  4. android实现聊天页面的气泡
  5. APPIUM Android(安卓)定位方式
  6. Professional Android(安卓)2 Development - 4
  7. Android(安卓)拉起另一个APP
  8. Android(安卓)WebView中软键盘会遮挡输入框相关问题
  9. 2018年Android面试整理

随机推荐

  1. android调用系统发短信界面功能
  2. ubuntu共享文件夹设置
  3. Drawable Mutations(Android(安卓)Drawab
  4. 【建议收藏】2020年中高级Android大厂面
  5. android学习资料
  6. Android 自动滚动的GridView
  7. android studio 报编码 GBK 的不可映射字
  8. Android APK安装失败,共享用户不兼容 INST
  9. android 状态栏透明,源码修改教程
  10. Android控件基本属性介绍