摘要:本文将带你了解Android应用开发之android 第三方app截图,希望本文对大家学Android有所帮助
本文将带你了解Android应用开发之android 第三方app截图,希望本文对大家学Android有所帮助
将View生成相应的图片是很容易的,所以app内截图可以采用此种方式。
Java代码 view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap screenshot = view.getDrawingCache(); //使用完图片之后再执行destroyDrawingCache,因为destroyDrawingCache内部会调用bitmap.recycle() view.destroyDrawingCache(); view.setDrawingCacheEnabled(false); 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条,我们只需要得知其高度即可,然后去除这几部分(这里没有考虑横屏)
Java代码 //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(); //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系统
Java代码 /** * 判断是否是魅族系统 * @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; } } /**
* 判断是否是魅族系统
* @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高度
Java代码 //获取魅族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; } //获取魅族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,然后将图片拼到一起
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号