一身转战三千里,一剑曾当百万师。这篇文章主要讲述android生成分享长图并且添加全图水印相关的知识,希望能为你提供帮助。
尊重他人的劳动成果,
转载请标明出处:
http://blog.csdn.net/gengqiquan/article/details/65938021,
本文出自:【gengqiquan的博客】
领导最近觉得携程的截屏生成长图分享效果比较好,
所以我们也加了个;
产品觉得分享出去的长图需要加公司品牌水印,
于是我们也加了个;
嗯,
事件起因就是这样。
长图一般是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();
}
// 创建对应大小的bitmapbitmap =
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;
}
【android生成分享长图并且添加全图水印】奉送个获取具体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 height =
first.getHeight();
Canvas canvas =
new Canvas(first);
int h =
0;
while (h <
height +
mark.getHeight()) {
canvas.drawBitmap(mark, 0, h, null);
h =
h +
mark.getHeight();
}
return first;
}
坑爹的chrome有bug。一在这个位置点换行接向上按键就崩溃。写个博客崩溃了七八次。最近真的是运气不好。
其实我是想说: 由于最近被注入了个对象, 依赖性比较强, 所以这段时间很少写博客了, 后面补上。
有什么建议的可以留言喔
如果我的博客对您有帮助, 请留言鼓励下或者点个赞吧!
我建了一个QQ群( 群号: 121606151) , 用于大家讨论交流android技术问题, 有兴趣的可以加下, 大家一起进步。
推荐阅读
- Android DDMS应用
- appium 环境安装
- SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理
- 形成具有给定范围内的整数的数组的方法,以使总和可被2整除
- Django教程详细指南介绍
- 如何开始软件测试职业-完整指南!
- 十进制等效项大于或等于K的子字符串的计数
- PHP stream_get_transports()函数用法示例
- 修改给定数组以使奇数和偶数索引元素的总和相同