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

特点

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

原理:

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

用法:

具体的view在

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);
  }
}

具体的用法

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));

  }
}

效果图

github源码地址

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

(0)

相关推荐

  • Android给任何view添加全屏倾斜水印

    本文主要介绍了Android给任何view添加全屏倾斜水印,具体如下,分享给大家 如果要实现如下效果 目前有两种思路: 1.先画出带有水平文字的照片,然后再和原图合成即可 2.旋转画布,然后直接画布写字即可 两种方案都差不多,这里讲解的第二种方案. 但是两种方案都存在问题,就是文字需要完全覆盖,那么就需要我们的画布要比图片大,其实只要把画布移动到原图的外切图即可. 为了简单分析问题,我们取最长的边,把原图当成正方形,外切正方形的边长即为对角边.如下图 从上图我们可以看出,我们需要旋转45度然后平

  • Android给图片加文字和图片水印实例代码

    我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行. /** * 图片工具类 * @author 水寒 * */ public class ImageUtil { /** * 设置水印图片在左上角 * @param Context * @param src * @param watermark * @param paddingLeft * @param paddingTop * @return */ public static Bi

  • Android实现分享长图并且添加全图水印

    Android实现分享长图并且添加全图水印 前言: 长图一般是ScrollView和ListView. 我们需要取得这两个控件的完整显示的图片.原理很简单,搞一张和控件长宽一致的画布(就是创建一个高宽相等的bitmap).然后调用控件的draw方法把自己画到画布上去. 分别贴出两个控件的长图获取方法 /** * 截取scrollview的屏幕 **/ public static Bitmap getScrollViewBitmap(ScrollView scrollView) { int h =

  • android使用ItemDecoration给RecyclerView 添加水印

    前言 项目中有使用到水印效果,如下图所示.在实现过程中,最终选用ItemDecoration来实现,其中有两大步骤:自定义Drawable来完成水印图片.使用ItemDecoration来布局水印. Demo在 WatermarkFragment 中,效果图如下: 1. 自定义Drawable完成水印图片 public class MyDrawable extends Drawable { Paint mPaint; public MyDrawable() { mPaint = new Pain

  • Android 图片添加水印的实现方法

    Android 图片添加水印的实现方法 实现效果图: 手机端打水印(文字和图片)使用的是Bitmap.Matrix和Canvas类的一些方法, 可以实现拉伸.旋转.位移等等效果. 原理很简单, 就是在画布Canvas上绘制图形.图片.文字等等, 得到你想要的效果图片. 百度搜索图片打水印有很多结果, 没找到斜着打水印的代码,有很多公司都要求上图的效果, 所以写着玩玩. /* 添加全屏斜着45度的文字 / public static Bitmap drawCenterLable(Context c

  • Android图片添加水印图片并把图片保存到文件存储的实现代码

    具体代码如下所示: package zhangphil.test; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import andro

  • Android实现为图片添加水印

    添加水印的方法挺简单的,具体内容如下 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView iv = (ImageView) findViewByI

  • Android 给图片加上水印的示例代码(支持logo+文字)

    本文介绍了Android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下: 现在我们想要往图片上打上水印,该水印应符合这样的需求的: 支持logo+文字: 文字信息支持多行展示: 用户可以选择水印在图片上的生成位置(左上.右上.右下和左下). 粗略的结构图低配版大概就长这样... 水印结构图.png 现在提供这样的一种思路去实现这一个需求,我们可以通过自定义一个view,view的布局中包含logo.公司名称和相关信息,这个view就是我们要打上图片的水印. 这样的一个vi

  • Android视频处理之动态时间水印效果

    最近的项目中遇到一个非常头痛的需求,在Android端录制视频的时候动态添加像监控画面一样的精确到秒的时间信息,关键是,并不是说只在播放器的界面显示时间就可以了,而是录制到视频里面去,这个MP4在电脑上播放也能看到每个画面的时间. 最后想到的办法是在录制完成以后去处理这个视频. 期间参考了很多资料,比较有用的大概是ffmpeg和比较新的Api mediaCodec系列了.介于ffmpeg都是C实现,和一大堆NDK相关,本人不是太懂,就重点关注了MediaCodec系列. 参考逻辑流程图一目了然的

  • Android添加水印的正确方法 只要三步!

    开门见山,添加水印的方法非常简单,其实就只有3个步骤: 1.载入原始图片 2.载入水印图片 3.保存带有水印的图片 实现的原理就是:获取原始图片的宽高,然后,新建一个同样宽高的bitmap,将这个新的bitmap作为画布,接着,就在这个画布上面画原图,画水印图片,有文字就接着画文字. 上面哪个顺序一定不能乱,不然你可能就看不到水印,或则文字了,因为画在原图下面去了 绘制水印的代码如下: private static Bitmap createWaterMaskBitmap(Bitmap src,

随机推荐