前言

最近做项目遇到个需求,截取当前页面后分享。在这里分享下实现过程。

效果图

请注意,我们实现的截图中没有知乎截图后顶部白色的一条。

知乎效果:

我们实现的效果(中间的图片为截图):

分析

给当前页面截图实际上就是通过获取当前 Window 的 DecorView 来获取整个视图,然后获取整个视图的 DrawingCache 就可以得到对应的 Bitmap. 如果只是给某个视图截图,则只需要调用该视图的 getDrawingCache() 方法,即可获取该视图的 Bitmap.

代码及解析

这次的代码比较少,也比较简单。

View tempView = getWindow().getDecorView();

//View tempView = button; //获取 Button 的截图

tempView.setDrawingCacheEnabled(true);

Bitmap bitmap = tempView.getDrawingCache();

tempView.setDrawingCacheEnabled(false);

上面的代码就实现了获取某个视图的截图并转化为 Bitmap. 通过这种方式,截图后效果如下:

我们可以观察到,上面的截图的顶部有一个白色长条(就像上面知乎的截图那样 →_→),其实那个白色长条是顶部的状态栏(StatusBar),如果不想要顶部的白条,我们只要把获取到的 Bitmap 顶部的状态栏截掉就可以了。

//获取状态栏高度

public int getStatusBarHeight() {

int result = 0;

int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");

if (resourceId > 0) {

result = getResources().getDimensionPixelSize(resourceId);

}

return result;

}

//获得除掉 StatusBar 的 Bitmap

bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, bitmap.getWidth(),

bitmap.getHeight() - statusBarHeight, null, true);

// 这里直接给 ImageView 设置 Bitmap 会报错,因为 tempView.setDrawingCacheEnabled(false); 方法会将缓存的 Bitmap 对象清空,所以建议先将 Bitmap 存储到本地,然后将存储到本地的图片显示到需要的位置。

imageView.setImageBitmap(bitmap);

认真你就赢了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐