服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - android实现文字水印效果 支持多行水印

android实现文字水印效果 支持多行水印

2022-08-15 10:22fulushan的技术专栏 Android

这篇文章主要为大家详细介绍了android添加文字水印,并支持多行水印,自定义角度和文字大小,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

特点

支持多行水印,支持自定义角度,支持自定义文字大小。

原理:

使用一个TextView 占据整个页面。在TextView基础上面打水印。

用法:

具体的view在

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package cn.fulushan.watermark.view;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
 
 
import java.util.List;
 
/**
 * Created by fulushan on 18/4/5.
 */
 
public class WaterMarkBg extends Drawable {
 
  private Paint paint = new Paint();
  private List<String> labels;
  private Context context;
  private int degress;//角度
  private int fontSize;//字体大小 单位sp
 
  /**
   * 初始化构造
   * @param context 上下文
   * @param labels 水印文字列表 多行显示支持
   * @param degress 水印角度
   * @param fontSize 水印文字大小
   */
  public WaterMarkBg(Context context,List<String> labels, int degress,int fontSize) {
    this.labels = labels;
    this.context = context;
    this.degress = degress;
    this.fontSize = fontSize;
  }
 
  @Override
  public void draw(@NonNull Canvas canvas) {
 
 
    int width = getBounds().right;
    int height = getBounds().bottom;
 
    canvas.drawColor(Color.parseColor("#40F3F5F9"));
    paint.setColor(Color.parseColor("#50AEAEAE"));
 
    paint.setAntiAlias(true);
    paint.setTextSize(sp2px(context,fontSize));
    canvas.save();
    canvas.rotate(degress);
    float textWidth = paint.measureText(labels.get(0));
    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, paint);
          spacing = spacing+50;
        }
 
      }
    }
    canvas.restore();
  }
 
  @Override
  public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
 
  }
 
  @Override
  public void setColorFilter(@Nullable ColorFilter colorFilter) {
 
  }
 
  @Override
  public int getOpacity() {
    return PixelFormat.UNKNOWN;
  }
 
 
  public static int sp2px(Context context, float spValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
  }
}

具体的用法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends AppCompatActivity {
  private TextView bg_tv;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bg_tv = findViewById(R.id.bg_tv);
 
    SimpleDateFormat createTimeSdf1 = new SimpleDateFormat("yyyy-MM-dd");
 
    List<String> labels = new ArrayList<>();
    labels.add("用户名:张三");
    labels.add("日期:"+ createTimeSdf1.format(new Date()));
    labels.add("不可扩散");
    bg_tv.setBackgroundDrawable(new WaterMarkBg(MainActivity.this,labels,-30,13));
 
 
  }
}

效果图

android实现文字水印效果 支持多行水印

github源码地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/fulushan/article/details/80082805?utm_source=blogxgwz4

延伸 · 阅读

精彩推荐
  • AndroidAndroid仿QQ微信实时监测网络状态

    Android仿QQ微信实时监测网络状态

    这篇文章主要为大家详细介绍了Android仿QQ微信实时监测网络状态,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    zpf_3452022-02-25
  • AndroidAndroid入门之LinearLayout、AbsoluteLayout的用法实例讲解

    Android入门之LinearLayout、AbsoluteLayout的用法实例讲解

    这篇文章主要介绍了Android入门之LinearLayout、AbsoluteLayout的用法,对于Android初学者有很好的参考借鉴价值,需要的朋友可以参考下...

    Android开发网11962021-03-05
  • AndroidAndroid实现图片随手指旋转功能

    Android实现图片随手指旋转功能

    这篇文章主要为大家详细介绍了Android实现图片随手指旋转功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    WillenWu4862022-02-12
  • AndroidAndroid中的Bitmap缓存池使用详解

    Android中的Bitmap缓存池使用详解

    这篇文章主要介绍了Android中的Bitmap缓存池使用详解,本文主要目的是讲解如何使用缓存来提高UI的载入输入和滑动的流畅性,需要的朋友可以参考下...

    Android开发网6932021-03-11
  • Androidandroid FragmentTabhost实现导航分页

    android FragmentTabhost实现导航分页

    这篇文章主要为大家详细介绍了android FragmentTabhost实现导航分页,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xixi袭阳4002022-07-28
  • AndroidAndroid开机自启动程序详解

    Android开机自启动程序详解

    本篇文章是对Android开机自启动程序进行了详细的分析介绍,需要的朋友参考下...

    Android开发网6792021-02-01
  • Android浅析android中的线程封装

    浅析android中的线程封装

    下面我就简单的说一下android对线程的c++封装。需要的朋友可以过来参考下。希望对大家有所帮助...

    Android开发网4282021-02-05
  • Androidkotlin实战教程之lambda编程

    kotlin实战教程之lambda编程

    这篇文章主要给大家介绍了关于kotlin实战教程之lambda编程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用kotlin具有一定的参考学习价...

    susion哒哒6142022-07-31