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。一在这个位置点换行接向上按键就崩溃。写个博客崩溃了七八次。最近真的是运气不好。
其实我是想说:由于最近被注入了个对象,依赖性比较强,所以这段时间很少写博客了,后面补上。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!