首页 > 系统 > Android > 正文

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

2019-12-12 03:16:43
字体:
来源:转载
供稿:网友

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。一在这个位置点换行接向上按键就崩溃。写个博客崩溃了七八次。最近真的是运气不好。

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表