美文网首页孚睿科技·ANDROID知识总结酷炫的UI效果Android进阶
Android:将一个Activity、某块布局转换成图片

Android:将一个Activity、某块布局转换成图片

作者: 筱南独舞 | 来源:发表于2016-09-05 17:26 被阅读4103次
  1. 使用截屏,然后保存图片

  2. 如果要保存的布局正好是撑满这个屏幕,那可以使用截屏的方式来保存图片;

  3. 如果只是屏幕的某一个部分,那才用截屏后,还得对截屏后的图片进行二次裁剪,而且要裁剪的坐标点也比较难正确得出;

  4. 要保存的布局大于当前屏幕,那就得多次截屏,然后再把几个截屏拼接起来,费时费力。

  5. 启用View自带绘制缓存(这个名字估计不太合适)
    Google估计早就想到了这个问题,在查看View的源码的时候,发现View本身有两个方法很有意思。
    一是:setDrawingCacheEnabled(boolean enabled),这个方法设置为true,就可以生成位图的副本(原话:This API can be used to manually generate a bitmap copy of this view, by setting the flag to <code>true</code> and calling {@link #getDrawingCache()}.);
    二是:getDrawingCache(),这个方法其实是调用的getDrawingCache(false),这个方法返回的一个绘制此View时的视图缓存Bitmap(原话:Returns the bitmap in which this view drawing is cached.);
    知道了这两个方法就可以将任意XML任意模块的View给生成图片,是不是很简单,如下:

  6. 父布局(要生成图片的布局,下边同)开启绘图缓存;

  7. 计算父布局宽高;

  8. 父布局设置layout;

  9. 用Bitmap.createBitmap(获取父布局到的cache)生成Bitmap;

  10. 关闭DrawingCache;

  11. 接下来是保存到本地还是直接设置给ImageView自己决定了。

点击保存图片按钮,执行如下代码,将布局保存成Bitmap设置给“小兵”下边那个ImageView,click的代码如下:

ll.setDrawingCacheEnabled(true);
ll.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
ll.layout(0, 0, ll.getMeasuredWidth(), ll.getMeasuredHeight());
Bitmap bitmap = Bitmap.createBitmap(ll.getDrawingCache());
ll.setDrawingCacheEnabled(false);
iv.setImageBitmap(bitmap);

运行前:


点击之前.png

点击保存图片后:


点击之后.png

相关文章

网友评论

  • 量U移动广告归因:如果要修改布局中某个元素 该怎么做呢
    筱南独舞:@waldenpond 修改?是生成图片后修改吗?修改后再重新生成也行。不知道是这个意思不
  • Mr_panmin:超出屏幕的部分生成不了图片。。。:sob:
    f9320167088f: @Mr_panmin 谢谢😊
    Mr_panmin:@小口茶 换种方式解决,代码如下:
    public Bitmap getBitmap(View view) {
    Bitmap bitmap = null;
    int width = view.getRight() - view.getLeft();
    int height = view.getBottom() - view.getTop();
    final boolean opaque = view.getDrawingCacheBackgroundColor() != 0 || view.isOpaque();
    Bitmap.Config quality;
    if (!opaque) {
    switch (view.getDrawingCacheQuality()) {
    case DRAWING_CACHE_QUALITY_AUTO:
    case DRAWING_CACHE_QUALITY_LOW:
    case DRAWING_CACHE_QUALITY_HIGH:
    default:
    quality = Bitmap.Config.ARGB_8888;
    break;
    }
    } else {
    quality = Bitmap.Config.RGB_565;
    }
    bitmap = Bitmap.createBitmap(getResources().getDisplayMetrics(),
    width, height, quality);
    bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);
    if (opaque) bitmap.setHasAlpha(false);
    boolean clear = view.getDrawingCacheBackgroundColor() != 0;
    Canvas canvas = new Canvas(bitmap);
    if (clear) {
    bitmap.eraseColor(view.getDrawingCacheBackgroundColor());
    }
    view.computeScroll();
    final int restoreCount = canvas.save();
    canvas.translate(-view.getScrollX(), -view.getScrollY());
    view.draw(canvas);
    canvas.restoreToCount(restoreCount);
    canvas.setBitmap(null);



    return bitmap;
    }
    f9320167088f:我的也是,而且还获取的是空
  • 我才是张雷:求 demo:joy:
    筱南独舞:@我才是张雷 共同进步:smile:
    我才是张雷:@筱南独舞 试了下,搞定了,感谢楼主分享
    筱南独舞:不用demo的,你就随便写个最简单的LinearLayout里边放俩ImageView,然后把LinearLayout生成图片,基本上就是文中的那些代码了。你试试
  • 04b5fead1fdc:我的布局文件生成的图片有一些textview不见了,你的有这个问题吗
  • 冰点k:你好,生成图片的时候view太大,生成的图片为空怎么解决啊
    百米冲刺:请问生成图片为空的问题解决了么?
    筱南独舞:@沵旳笑容魅惑了涐的瞳孔 恩,比如呢?详细一些
  • 小白菜321:真好!

本文标题:Android:将一个Activity、某块布局转换成图片

本文链接:https://www.haomeiwen.com/subject/wcirettx.html