android 水印背景功能,Android 给View添加剧复的文字水印背景 相似钉钉通信录的背景效果...
从新写了一种更好的实现方式能够点下边的连接去看下
效果图以下
首先来讲下思路
由于咱们是要显示一个重复显示不少个的水印背景图,个人思路是绘制出一个文字是斜着的矩形图片,而后做为背景平铺。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添加剧复的文字水印背景 相似钉钉通信录的背景效果...相关推荐
- android相册幻灯片功能,Android实现幻灯片式图片浏览器
我们来实现一个幻灯片式图片浏览器: 最下面一个画廊视图,选中画廊中的图片,会在上面的ImageSwitcher控件中显示大图. 效果图如图 实现方法: 在布局文件中添加图片切换控件ImageSwitc ...
- android裁剪图片功能,Android实现图片区域裁剪功能
今天做的就是关于实现图片的区域裁剪功能.由于项目功能的需要笔者需要实现PDF文档的阅读,并且就某个页面实现"图片"裁剪(一个页面理解为一张图片).笔者对着方面是一点儿也不熟悉,因此 ...
- android 语音发送功能,Android仿微信、录制音频并发送功能
MyRecorder(仿微信,录制音频并发送功能) ①布局实现(activity_main.xml)布局采用线性布局,上面使用的一个ListView,下面使用的是一个自定义的Button(会在下面进行 ...
- android 微信评论功能,Android仿微信朋友圈点赞和评论功能
最近在做朋友圈的项目,所以写一个Android仿朋友圈点赞和评论功能Demo,代码就是简单实现了一下功能,没有做优化,凑合看. 图文排列是用的RecyclerView实现的,弹窗效果是用的自定义的Po ...
- android的UDC功能,Android实现搜索历史功能
本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空 1. 判断搜索内容是否含表情,不 ...
- android放微信@功能,Android仿微信语音消息的录制和播放功能
一.简述 效果: 实现功能: 长按Button时改变Button显示文字,弹出Dialog(动态更新音量),动态生成录音文件,开始录音: 监听手指动作,规定区域.录音状态下手指划出规定区域取消录音,删 ...
- android 本地提醒功能,android中的本地定时推送到通知栏
一.使用系统定义的Notification 以下是使用示例代码: import android.app.Notification; import android.app.NotificationMan ...
- Android添加拍照功能,Android开发实现拍照功能的方法实例解析
本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...
- android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能
最近闲来无事,随便看看各种UI实现的代码 打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置 这个实现起来其实很简单,咱们就来看看吧 最简单的Recyc ...
最新文章
- [脑海成像]科学家利用动态电极绕过眼睛直接刺激大脑,在盲人脑海画出字母
- 话里话外:“按单制造”的业务特点(一)
- java堆内存 和栈内存
- OSGI和Spring动态模块–简单的Hello World
- 往对象数组里面添加相同的key 不同的value
- 音频服务器未运行怎么办,音频服务未运行怎么办 音频服务未运行解决方法【详细介绍】...
- LeetCode 452 用最少数量的箭引爆气球
- c/c++通用头文件
- 时间戳TimeStamp处理
- 全球顶级银行资管子公司的启示
- 域名IP段批量生成器源码
- java判断 港(澳)台大陆身份证校验
- 计算机毕业设计-基于springboot的社区志愿者管理系统
- 基于残差网络的城市人群流动预测
- python实现人民币金额大写转小写数字
- @Validated和@Valid使用
- java 任意多边形面积计算
- Iviews视频搜索引擎
- 华为操作系统鸿蒙 hms生态系统,华为HMS生态系统服务是什么 鸿蒙操作系统机会来...
- 反思广交会:人民币升值对中国经济压力有多大?
热门文章
- 无人驾驶插秧机智能辅助系统_无人驾驶插秧机搭载北斗导航驾驶系统,误差仅在2.5厘米内...
- SQL中的ROW_NUMBER()和while循环对每一行执行操作
- javascript call 详细解答与实践
- mysql清理死链接_对MySQL的死连接Sleep的进程的来源研究
- 2019-11-26 https://raw.githubusercontent.com和谐/gfwlist/gfwlist/master/gfwlist.txt
- c语言学籍管理实验报告,c语言实验报告(学生学籍管理系统)
- 12平键标准尺寸规格表_郑州花纹板加工规格尺寸表
- Java中使用KCP协议
- php常用库函数(三)
- 2021杨铭杰高考成绩查询,谁知道汕头一中2007年高考成绩的概况