比较很少见的奇葩功能,给App所有界面添加水印功能。网上有单行,多行的这里为了方便使用,集成了既支持单行又支持多行的功能。废话不多说,直接上代码:

一、工具类

public class Watermark {/*** 水印文本*/private String mText;private List<String> labels;/*** 字体颜色,十六进制形式,例如:0xAEAEAEAE*/private int mTextColor;/*** 字体大小,单位为sp*/private float mTextSize;/*** 旋转角度*/private float mRotation;private static Watermark sInstance;private Watermark() {mText = "";mTextColor = 0xAEAEAEAE;mTextSize = 18;mRotation = -25;}public static Watermark getInstance() {if (sInstance == null) {synchronized (Watermark.class) {sInstance = new Watermark();}}return sInstance;}/*** 设置水印文本** @param text 文本* @return Watermark实例*/public Watermark setText(String text) {mText = text;return sInstance;}/*** 设置多行水印文本** @return Watermark实例*/public Watermark setMultiLine(List<String> lab) {labels = lab;return sInstance;}/*** 设置字体颜色** @param color 颜色,十六进制形式,例如:0xAEAEAEAE* @return Watermark实例*/public Watermark setTextColor(int color) {mTextColor = color;return sInstance;}/*** 设置字体大小** @param size 大小,单位为sp* @return Watermark实例*/public Watermark setTextSize(float size) {mTextSize = size;return sInstance;}/*** 设置旋转角度** @param degrees 度数* @return Watermark实例*/public Watermark setRotation(float degrees) {mRotation = degrees;return sInstance;}/*** 显示水印,铺满整个页面** @param activity 活动*/public void show(Activity activity) {show(activity, mText);}/*** 显示水印,铺满整个页面** @param activity 活动* @param text     水印*/public void show(Activity activity, String text) {WatermarkDrawable drawable = new WatermarkDrawable();drawable.mText = text;drawable.mTextColor = mTextColor;drawable.mTextSize = mTextSize;drawable.mRotation = mRotation;ViewGroup rootView = activity.findViewById(android.R.id.content);FrameLayout layout = new FrameLayout(activity);layout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));layout.setBackground(drawable);layout.setAlpha(0.3f);rootView.addView(layout);}private class WatermarkDrawable extends Drawable {private Paint mPaint;/*** 水印文本*/private String mText;/*** 字体颜色,十六进制形式,例如:0xAEAEAEAE*/private int mTextColor;/*** 字体大小,单位为sp*/private float mTextSize;/*** 旋转角度*/private float mRotation;private WatermarkDrawable() {mPaint = new Paint();}@Overridepublic void draw(@NonNull Canvas canvas) {if(labels!=null&&labels.size()>0){//多行文本int width = getBounds().right;int height = getBounds().bottom;canvas.drawColor(0x00000000);mPaint.setColor(mTextColor);mPaint.setAntiAlias(true);mPaint.setTextSize(ConvertUtils.spToPx(mTextSize));canvas.save();canvas.rotate(mRotation);//计算集合中最长的宽度float textWidth = 0;for (int i = 0; i < labels.size(); i++) {if(textWidth<mPaint.measureText(labels.get(i))){textWidth = mPaint.measureText(labels.get(i));}}int index = 0;for (int positionY = height / 10; positionY <= height; positionY += height / 10+80) {float fromX = -width + (index++ % 2) * textWidth;for (float positionX = fromX; positionX < width; positionX += textWidth * 2) {int spacing = 0;//间距for(String label:labels){canvas.drawText(label, positionX, positionY+spacing, mPaint);spacing = spacing+50;}}}canvas.restore();}else if(!TextUtils.isEmpty(mText)){//单行文本int width = getBounds().right;int height = getBounds().bottom;int diagonal = (int) Math.sqrt(width * width + height * height); // 对角线的长度mPaint.setColor(mTextColor);mPaint.setTextSize(ConvertUtils.spToPx(mTextSize)); // ConvertUtils.spToPx()这个方法是将sp转换成px,ConvertUtils这个工具类在我提供的demo里面有mPaint.setAntiAlias(true);float textWidth = mPaint.measureText(mText);canvas.drawColor(0x00000000);canvas.rotate(mRotation);int index = 0;float fromX;// 以对角线的长度来做高度,这样可以保证竖屏和横屏整个屏幕都能布满水印for (int positionY = diagonal / 10; positionY <= diagonal; positionY += diagonal / 10) {fromX = -width + (index++ % 2) * textWidth; // 上下两行的X轴起始点不一样,错开显示for (float positionX = fromX; positionX < width; positionX += textWidth * 2) {canvas.drawText(mText, positionX, positionY, mPaint);}}canvas.save();canvas.restore();}}@Overridepublic void setAlpha(@IntRange(from = 0, to = 255) int alpha) {}@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}}
}

二、ConvertUtils工具类

public class ConvertUtils {/*** Value of sp to value of px.** @param spValue The value of sp.* @return value of px*/public static int spToPx(float spValue) {float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}}

三、使用方法(在BaseActivity中使用,所有Activity继承该类即可)
需要注意的是在BaseActiviy中的setContentView(int layoutResId)中使用

单行水印:方式一

@Overridepublic void setContentView(int layoutResID) {super.setContentView(layoutResID);Watermark.getInstance().setText("水印的内容").setTextColor(0xAE000000).setTextSize(14).setRotation(-30).show(this);}

方式二:其实多行水印只放入集合中一条也可实现.

多行水印

@Overridepublic void setContentView(int layoutResID) {super.setContentView(layoutResID);String dateTimeFormat = DateUtil.getDateTimeFormat(new Date());Staff staff = ProjectNameApp.getInstance().getStaff();// 可以自定义水印文字颜色、大小和旋转角度List<String> labels = new ArrayList<>();labels.add(staff.getName());labels.add(staff.getMobile());labels.add(dateTimeFormat);Watermark.getInstance().setMultiLine(labels).setTextColor(0xAE000000).setTextSize(14).setRotation(-30).show(this);}

希望能帮助到各位,你的一个点赞都是对我的支持,谢谢!!

App中所有页面添加水印(支持单行和多行)相关推荐

  1. Hybrid App中原生页面 VS H5页面

    Hybrid App中原生页面 VS H5页面 现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有"混合的"意思). Native ...

  2. Hybrid App中原生页面 VS H5页面(分享)

    本文部分转自  http://www.jianshu.com/p/00ff5664e000 现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有" ...

  3. Android精华篇 - App中原生页面 VS H5页面

    现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有"混合的"意思). Native App(原生app,后面都用"原生ap ...

  4. axure如何实现跳转_Axure中继器实现APP中设置页面的各种列表

    中继器是Axure中的一个高级元件,可以当做Axure中的小型数据库使用,用于实现一些增删查改的效果,同时可用于一些具有相同元件组合的组件的快速生成,比如APP中的设置,如下图所示.下面我们介绍一下怎 ...

  5. APP中H5页面实现拨打电话功能

    萨瓦迪卡,欢迎大家~~ <a href="tel:400-0000-000">400-0000-000</a>//如失效,就在head标签里加上<me ...

  6. android应用APP中的页面响应时间测试

    说明:这里只介绍基本测试逻辑 整理出 整个APP需要关注的一级页面列表 基本工具:ut(内部工具,不便透露细节) 在开发代码中引入TimeProfile类:这个类是ut的最上层,暴露出一些简单的时间打 ...

  7. 设计灵感|App中的页面空状态应该如何表现?

    什么是空状态? 空状态:顾名思义就是空白的状态,空状态是对没有数据页面的补充,一种对零数据的设计形式(如下图所示:无网络.订单为空.没有关注的人以及无法连接网络等等这些页面就是所谓的"空状态 ...

  8. UI模板素材|教你App中的页面指示器要如何设计

    在日常浏览APP的过程中,经常可以看到页面选择器,它们的位置各有不同,样式也多种多样.这篇文章就和大家浅谈一下页面指示器的常见位置及设计样式. 寻呼指示勘探 什么是页面指示器 通常在 banner或图 ...

  9. APP中某个页面巨卡

    今天笔者的一个朋友说他公司的APP(无PC端),点击一个课程页面巨慢,问我是不是资源不够用了需要升级? 我点击查看了一下,凭经验判断可能是数据库查询的问题,轻则卡20秒重则卡2分钟,登入数据库show ...

最新文章

  1. 关于云计算 你所知道的可能不是真的
  2. 搭载M1芯片的MacBook能不能当开发主力机?程序员半个月的亲身体验都在这里
  3. python培训班哪些比较好-哪家python培训班比较好?2018年如何选择
  4. python 打开文件-Python打开文件的方式
  5. 给thinkphp3.2用上composer
  6. 记录一个海思TOE的BUG
  7. 多径传播matlab仿真·信号分析处理
  8. go 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序
  9. IE6 CSS bug: position:relative元素被overflow:auto/scroll元素包含
  10. 长假大考充电桩:堵车不可怕,没电才尴尬
  11. ionic serve报错 spawn cmd ENOENT
  12. python编程入门经典-Python编程入门经典
  13. PHP endif、endwhile、endfor、冒号、switch、foreach使用介绍、Heredoc 、Nowdoc
  14. Oracle12c创建可插入式数据库pdb和连接pdb并创建用户心得
  15. html5判断文字超过几行,判断文字数量超过2行 添加展开按钮 未超过两行则不显示按钮 溢出部分显示省略号...
  16. 被誉为现代电子计算机之父是,成教云: 人们习惯上尊称图灵为现代电子计算机之父。...
  17. 如何在Github上建立自己的个人博客网站详细教程
  18. [面试][PTA]充满趣味的程序员文史综合卷
  19. 10款堪称神器的免费电脑软件推荐
  20. 彻底破解加密PDF文件

热门文章

  1. 欠缺的_习惯累积沉淀_新浪博客
  2. yum.repos.d目录中文件消失如何解决
  3. MFC应用程序关闭时,提示兼容性助手。
  4. 微信小程序开发之表单验证(WxValidate使用)
  5. linux python3安装proton_深度deepin系统中通过Lutris(wine、proton)运行逆水寒的方法 ......
  6. 万豪环保系列之《紫外线消毒器》
  7. 使用gdiplus显示gif图片
  8. 切图具体需要切什么内容_UI日常-切图切图怎么破?
  9. window 删除文件报错显示被程序占用 强制删除被占用的文件
  10. 配置软路由-同时连接内网和外网