从新写了一种更好的实现方式能够点下边的连接去看下

效果图以下

首先来讲下思路

由于咱们是要显示一个重复显示不少个的水印背景图,个人思路是绘制出一个文字是斜着的矩形图片,而后做为背景平铺。canvas

那么如何绘制带文字的矩形图片呢

首先咱们要绘制一个矩形上,那么矩形的对角线上显示的就是咱们的文字,文字根据绘制路径来绘制,主要是这个方法函数

Canvas.drawTextOnPath()工具

而后就是要绘制一条斜线,斜线的长度根据须要绘制的字符串长度来决定。字体

Paint mPaint = new Paint();

oneTextPx=DensityUtil.sp2px(mContext, textSize);

mPaint.setTextSize(oneTextPx);

//计算字长

textLength = (int) mPaint.measureText(gText);

知道了三角形的斜线长度以后,根据勾股定理,能够知道长宽的平方和是斜线的平方。spa

这里我 假设个人长是宽的三倍。而后就能够求出矩形的长宽了。.net

计算出长宽以后,考虑到文字是有高度的,那么绘制的矩形还须要更长一点。加入一点偏移量,恩,就给长宽都加上一个字长吧~rest

到此时咱们知道了画板的长宽,以及文字的绘制路径的坐标点了。code

首先绘制路径起点移动到斜矩形的左下角,而后设置移动到右下角的点;blog

//先移动到绘制路线的起始点,左下角

path.moveTo(10, highPx+oneTextPx);

//绘制的结束点

path.lineTo(witchPx, oneTextPx);

绘制好路径以后,就能够绘制文字了。

而后就能够生成bitmap图片了,以后就设置都须要设置背景的控件上去。

下边是一个关于文字绘制的图

斜的矩形是显示绘制文字的区域

横着的矩形是画板

贴一下完整的代码

/**

* 字的大小 单位sp

*/

final int textSize = 16;

/**

* 一个字所占的像素

*/

int oneTextPx;

/**

* 当前字符串所占的长度

*/

int textLength;

/**

* 默认后缀文字

*/

String sText = "深圳";

/**

* 默认后缀文字的宽高

*/

int sWitchPx;

int sHigthPx;

/**

* 第二段sText文字距离前一段文字的水平偏移量

*/

int offset = 40;

int right = 80;

/**

* 生成水印文字图片

*/

public BitmapDrawable drawTextToBitmap(Context mContext, String gText) {

gText = gText;

try {

Paint mPaint = new Paint();

oneTextPx = DensityUtil.sp2px(mContext, textSize);

mPaint.setTextSize(oneTextPx);

//计算字长

textLength = (int) mPaint.measureText(gText);

int stextLength = (int) mPaint.measureText(sText);

int witchPx = 0;

int highPx = 0;

if (sWitchPx == 0) {

sWitchPx = measurementWitch(stextLength);

sHigthPx = measurementHigth(stextLength);

}

witchPx = measurementWitch(textLength);

highPx = measurementHigth(textLength);

//设置画板的时候 增长一个字的长宽

Bitmap bitmap = Bitmap.createBitmap(witchPx + sWitchPx + 2 * oneTextPx + offset+right,

highPx + oneTextPx, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

canvas.drawColor(Color.WHITE);

Paint paint = new Paint();

paint.setColor(Color.GRAY);

paint.setAlpha(80);

paint.setAntiAlias(true);

paint.setTextAlign(Paint.Align.LEFT);

paint.setTextSize(oneTextPx);

Path path = new Path();

//传入文字的路径绘制

//先移动到绘制路线的起始点,左下角

path.moveTo(10, highPx + oneTextPx);

//绘制的结束点

path.lineTo(witchPx + oneTextPx, oneTextPx);

canvas.drawTextOnPath(gText, path, 0, 0, paint);

//重置路径,开始绘制默认文字路径

path.reset();

path.moveTo(witchPx + oneTextPx

+ 10 + offset, highPx + oneTextPx);

path.lineTo(witchPx + sWitchPx + 2 * oneTextPx + offset, highPx - sHigthPx + oneTextPx);

canvas.drawTextOnPath(sText, path, 0, 0, paint);

canvas.save(Canvas.ALL_SAVE_FLAG);

canvas.restore();

BitmapDrawable drawable = new BitmapDrawable(mContext.getResources(),bitmap);

drawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

drawable.setDither(true);

return drawable;

} catch (Exception e) {

}

return null;

}

private int measurementWitch(int textLength) {

//t2 为字长的平方 字长的平方即为三角形的斜边的平方

int t2 = textLength * textLength;

//此处设置 三角形的长为高的3倍,那么就是平方以后的9倍,均分为10份 长占9份

return ceilInt(Math.sqrt(t2 - (t2 / 10)));

}

private int measurementHigth(int textLength) {

//t2 为字长的平方 字长的平方即为三角形的斜边的平方

int t2 = textLength * textLength;

//此处设置 三角形的长为高的3倍,那么就是平方以后的9倍,均分为10份 长占9份

return ceilInt(Math.sqrt(t2 / 10));

}

public static int ceilInt(double number) {

return (int) Math.ceil(number);

}

}

剩下的问题

如今就能够不须要顾及以前的文字长度的问题了,不过还有一个问题没有结局 o(╯□╰)o。

在不一样的机型上字体显示的有的出入比较大,考虑过多是屏幕密度的问题,获取了一下他们的值

貌似看起来差异不大,实际上一加5T上 字很小很小很小。。。。

暂时这个问题没有解决,有大神知道的。求指导!恩完了。

苍天大地绕过谁~终于找到这个文字在一些手机上显示太小的缘由了,搞了半天不是画笔计算的错误,是BitmapDrawable旧的过期的方法没有去设置密度,新的构造函数,能够正确设置其目标的密度。就是这一句话!换了目前就没有发现别的问题了。

Drawable drawable = new BitmapDrawable(bitmap);

BitmapDrawable drawable = new BitmapDrawable(mContext.getResources(),bitmap);

说一下这个问题解决的思路,由于一开始考虑的是画笔由于屏幕密度的致使变形的问题,而后看了一些TextView的源码,结果发现貌似TExtView算出的字体大小跟个人差很少,而后自定义了一个view,重写onDraw方法,绘制了文字 结果发现字体大小是正常的。因而开始考虑是否是转化成BitmapDrawable出了问题,发现BitmapDrawable的构造方法过期了,看了一下新的构造方法,结果发现新的构造方法里边设置了初始目标的密度,

而后果断一改运行,发现ok了!

天咧 终于找到这个坑了!

下边是2016年的代码o(╯□╰)o

--------------------------------------------------------2018年4月4日16:06:53-----------------------------------------------------------------------------------------------以上为更新内容----------------------------终于有时间回过头来看看这个问题了----------------------------------------如下为旧的-------------------------------------

先看效果:

先说实现方式:

一、首先先用文字建立一个Bitmap 图片。

Bitmap bitmap = Bitmap.createBitmap(420, 240, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

canvas.drawColor(Color.WHITE);

Paint paint = new Paint();

paint.setColor(Color.GRAY);

paint.setAlpha(80);

paint.setAntiAlias(true);

paint.setTextAlign(Paint.Align.LEFT);

paint.setTextSize(40);

Path path = new Path();

path.moveTo(0, 150);

path.lineTo(160 * 2, 0);

canvas.drawTextOnPath(gText, path, 0, 20, paint);

canvas.save(Canvas.ALL_SAVE_FLAG);

canvas.restore();

bitmap.recycle();在一个空白的背景上画出文字内容,此处的经过设置一个斜向上的path,而后在这个path上写文字,生成一个斜向上方形的文字。

最后获得一个Bitmap.

二、将生成的bitmap 一个view上

BitmapDrawable drawable = new BitmapDrawable(bitmap);

drawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

drawable.setDither(true);

view.setBackgroundDrawable(drawable );

最后贴上工具类代码:若是只想要背景图片 用drawTextToBitmap(), 若是要直接给一个view设置上背景 直接使用setWaterMarkTextBg()方法。

public class WaterMarkTextUtil {

//设置背景

public void setWaterMarkTextBg(View view, Context gContext, String gText) {

view.setBackgroundDrawable(drawTextToBitmap(gContext, gText));

}

/**

* 生成水印文字图片

*/

public BitmapDrawable drawTextToBitmap(Context gContext, String gText) {

gText=gText+" daydao";

if (ACache.get(gContext).getAsBitmap(gText) != null) {

BitmapDrawable drawable = new BitmapDrawable(ACache.get(gContext).getAsBitmap(gText));

drawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

drawable.setDither(true);

return drawable;

}

try {

Bitmap bitmap = Bitmap.createBitmap(420, 240, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

canvas.drawColor(Color.WHITE);

Paint paint = new Paint();

paint.setColor(Color.GRAY);

paint.setAlpha(80);

paint.setAntiAlias(true);

paint.setTextAlign(Paint.Align.LEFT);

paint.setTextSize(40);

Path path = new Path();

path.moveTo(0, 150);

path.lineTo(160 * 2, 0);

canvas.drawTextOnPath(gText, path, 0, 20, paint);

canvas.save(Canvas.ALL_SAVE_FLAG);

canvas.restore();

ACache.get(gContext).put(gText, bitmap);

BitmapDrawable drawable = new BitmapDrawable(bitmap);

drawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

drawable.setDither(true);

bitmap.recycle();

return drawable;

} catch (Exception e) {

}

return null;

}

}

android 水印背景功能,Android 给View添加剧复的文字水印背景 相似钉钉通信录的背景效果...相关推荐

  1. android相册幻灯片功能,Android实现幻灯片式图片浏览器

    我们来实现一个幻灯片式图片浏览器: 最下面一个画廊视图,选中画廊中的图片,会在上面的ImageSwitcher控件中显示大图. 效果图如图 实现方法: 在布局文件中添加图片切换控件ImageSwitc ...

  2. android裁剪图片功能,Android实现图片区域裁剪功能

    今天做的就是关于实现图片的区域裁剪功能.由于项目功能的需要笔者需要实现PDF文档的阅读,并且就某个页面实现"图片"裁剪(一个页面理解为一张图片).笔者对着方面是一点儿也不熟悉,因此 ...

  3. android 语音发送功能,Android仿微信、录制音频并发送功能

    MyRecorder(仿微信,录制音频并发送功能) ①布局实现(activity_main.xml)布局采用线性布局,上面使用的一个ListView,下面使用的是一个自定义的Button(会在下面进行 ...

  4. android 微信评论功能,Android仿微信朋友圈点赞和评论功能

    最近在做朋友圈的项目,所以写一个Android仿朋友圈点赞和评论功能Demo,代码就是简单实现了一下功能,没有做优化,凑合看. 图文排列是用的RecyclerView实现的,弹窗效果是用的自定义的Po ...

  5. android的UDC功能,Android实现搜索历史功能

    本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空 1. 判断搜索内容是否含表情,不 ...

  6. android放微信@功能,Android仿微信语音消息的录制和播放功能

    一.简述 效果: 实现功能: 长按Button时改变Button显示文字,弹出Dialog(动态更新音量),动态生成录音文件,开始录音: 监听手指动作,规定区域.录音状态下手指划出规定区域取消录音,删 ...

  7. android 本地提醒功能,android中的本地定时推送到通知栏

    一.使用系统定义的Notification 以下是使用示例代码: import android.app.Notification; import android.app.NotificationMan ...

  8. Android添加拍照功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  9. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能

    最近闲来无事,随便看看各种UI实现的代码 打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置 这个实现起来其实很简单,咱们就来看看吧 最简单的Recyc ...

最新文章

  1. [脑海成像]科学家利用动态电极绕过眼睛直接刺激大脑,在盲人脑海画出字母
  2. 话里话外:“按单制造”的业务特点(一)
  3. java堆内存 和栈内存
  4. OSGI和Spring动态模块–简单的Hello World
  5. 往对象数组里面添加相同的key 不同的value
  6. 音频服务器未运行怎么办,音频服务未运行怎么办 音频服务未运行解决方法【详细介绍】...
  7. LeetCode 452 用最少数量的箭引爆气球
  8. c/c++通用头文件
  9. 时间戳TimeStamp处理
  10. 全球顶级银行资管子公司的启示
  11. 域名IP段批量生成器源码
  12. java判断 港(澳)台大陆身份证校验
  13. 计算机毕业设计-基于springboot的社区志愿者管理系统
  14. 基于残差网络的城市人群流动预测
  15. python实现人民币金额大写转小写数字
  16. @Validated和@Valid使用
  17. java 任意多边形面积计算
  18. Iviews视频搜索引擎
  19. 华为操作系统鸿蒙 hms生态系统,华为HMS生态系统服务是什么 鸿蒙操作系统机会来...
  20. 反思广交会:人民币升值对中国经济压力有多大?

热门文章

  1. 无人驾驶插秧机智能辅助系统_无人驾驶插秧机搭载北斗导航驾驶系统,误差仅在2.5厘米内...
  2. SQL中的ROW_NUMBER()和while循环对每一行执行操作
  3. javascript call 详细解答与实践
  4. mysql清理死链接_对MySQL的死连接Sleep的进程的来源研究
  5. 2019-11-26 https://raw.githubusercontent.com和谐/gfwlist/gfwlist/master/gfwlist.txt
  6. c语言学籍管理实验报告,c语言实验报告(学生学籍管理系统)
  7. 12平键标准尺寸规格表_郑州花纹板加工规格尺寸表
  8. Java中使用KCP协议
  9. php常用库函数(三)
  10. 2021杨铭杰高考成绩查询,谁知道汕头一中2007年高考成绩的概况