欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现分享长图并且添加全图水印

程序员文章站 2022-07-21 15:16:49
android实现分享长图并且添加全图水印 前言: 长图一般是scrollview和listview。 我们需要取得这两个控件的完整显示的图片。原理很简单,搞一...

android实现分享长图并且添加全图水印

前言:

长图一般是scrollview和listview。

我们需要取得这两个控件的完整显示的图片。原理很简单,搞一张和控件长宽一致的画布(就是创建一个高宽相等的bitmap)。然后调用控件的draw方法把自己画到画布上去。

分别贴出两个控件的长图获取方法

 /**
   * 截取scrollview的屏幕
   **/
  public static bitmap getscrollviewbitmap(scrollview scrollview) {
    int h = 0;
    bitmap bitmap;
    for (int i = 0; i < scrollview.getchildcount(); i++) {
      h += scrollview.getchildat(i).getheight();
    }
    // 创建对应大小的bitmap

    bitmap = bitmap.createbitmap(screenutils.getscreenwidth(scrollview.getcontext()), h,
        bitmap.config.argb_4444);
    final canvas canvas = new canvas(bitmap);
    canvas.drawcolor(color.parsecolor("#f2f7fa"));
    scrollview.draw(canvas);
    return bitmap;
  }

 /**
   * 截图listview
   **/
  public static bitmap getlistviewbitmap(listview listview, string picpath) {
    int h = 0;
    bitmap bitmap;
    // 获取listview实际高度
    for (int i = 0; i < listview.getchildcount(); i++) {
      h += listview.getchildat(i).getheight();
    }
listview.getheight());
    // 创建对应大小的bitmap
    bitmap = bitmap.createbitmap(listview.getwidth(), h,
        bitmap.config.rgb_565);
    final canvas canvas = new canvas(bitmap);
    canvas.drawcolor(color.white);
    listview.draw(canvas);
    // 测试输出
    fileoutputstream out = null;
    try {
      out = new fileoutputstream(picpath);
    } catch (filenotfoundexception e) {
      e.printstacktrace();
    }
    try {
      if (null != out) {
        bitmap.compress(bitmap.compressformat.png, 100, out);
        out.flush();
        out.close();
      }
    } catch (ioexception e) {
    }
    return bitmap;
  }

奉送个获取具体view的显示图的方法

  /**
   * 生成某个view的图片
   *
   * @author gengqiquan
   * @date 2017/3/20 上午10:34
   */
  public static bitmap getviewdrawingcachebitmap(view view) {
    view = view.getrootview();
    if (!view.isdrawingcacheenabled()) {
      view.setdrawingcacheenabled(true);
    }
    view.destroydrawingcache();
    view.builddrawingcache();
    bitmap bm = view.getdrawingcache();
    view.setdrawingcacheenabled(false);
    return bm;
  }

再奉送个生成某个linearlayout图片的方法

/**
   * 生成某个linearlayout的图片
   *
   * @author gengqiquan
   * @date 2017/3/20 上午10:34
   */
  public static bitmap getlinearlayoutbitmap(linearlayout linearlayout) {
    int h = 0;
    // 获取linearlayout实际高度
    for (int i = 0; i < linearlayout.getchildcount(); i++) {
      linearlayout.getchildat(i).measure(0, 0);
      h += linearlayout.getchildat(i).getmeasuredheight();
    }
    linearlayout.measure(0, 0);
    // 创建对应大小的bitmap
    bitmap bitmap = bitmap.createbitmap(linearlayout.getmeasuredwidth(), h,
        bitmap.config.rgb_565);
    final canvas canvas = new canvas(bitmap);
    canvas.drawcolor(color.white);
    linearlayout.draw(canvas);
    return bitmap;
  }

完了产品肯定会让你在下面或者上面加上公司的logo图片的,嗯。好人做到低,再送个拼接图片的方法

/**
*拼接图片
 * @param first 分享的长图
 * @param second 公司logo图
*@author gengqiquan
*@date 2017/3/25 下午4:56
*/
  public static bitmap add2bitmap(bitmap first, bitmap second) {
    float scale = ((float) first.getwidth()) / second.getwidth();
    second = imageutil.scaleimg(second, scale);
    int width = first.getwidth();
    int height = first.getheight() + second.getheight();
    bitmap result = bitmap.createbitmap(width, height, bitmap.config.argb_4444);
    canvas canvas = new canvas(result);
    canvas.drawbitmap(first, 0, 0, null);
    canvas.drawbitmap(second, 0, first.getheight(), null);
    return result;
  }

再来个添加全图水印的方法

/**
   * @param first 原始图
   * @param mark 水印图
   * @author gengqiquan
   * @date 2017/3/25 下午4:58
   */
  public static bitmap watermark(bitmap first, bitmap mark) {
    float scale = ((float) first.getwidth()) / mark.getwidth();
    mark = imageutil.scaleimg(mark, scale);
    int width = first.getwidth();
    int height = first.getheight();
    bitmap result = bitmap.createbitmap(width, height, bitmap.config.argb_4444);
    canvas canvas = new canvas(result);
    canvas.drawbitmap(first, 0, 0, null);
    int h = 0;
    while (h < height + mark.getheight()) {
      canvas.drawbitmap(mark, 0, h, null);
      h = h + mark.getheight();
    }
    return result;
  }

坑爹的chrome有bug。一在这个位置点换行接向上按键就崩溃。写个博客崩溃了七八次。最近真的是运气不好。

其实我是想说:由于最近被注入了个对象,依赖性比较强,所以这段时间很少写博客了,后面补上。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!