Android 水印效果

Android 水印效果

本文主要介绍下android 中水印的实现效果.

实现的方式有多种,就不一一赘述了, 本文就是通过自定义drawable来实现水印.

不多说,直接上代码吧:

import android.content.Context;
import android.content.res.Resources;
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.util.DisplayMetrics;

public class WatermarkDrawable extends Drawable {
   
    private String watermarkText;
    private Paint paint;
    private boolean isOne;
    private int numX, numY;
    private int mWidth, mHeight, mOffSet, textWidth, textHeight;
    private Context mContext;

    public WatermarkDrawable(Context context, String text, boolean isOne) {
   
        watermarkText = text;
        mContext = context;
        this.isOne = isOne;
        paint = new Paint();
        paint.setColor(Color.GRAY);
        paint.setTextSize(50);
        paint.setAlpha(100);
        textWidth = (int) paint.measureText(watermarkText);
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        textHeight = (int) (fontMetrics.descent - fontMetrics.ascent);
        Resources resources = mContext.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        mWidth = dm.widthPixels;
        mHeight = dm.heightPixels;
        mOffSet = ((mHeight - mWidth) >> 1);

        int max = Math.max(mWidth, mHeight);
        numX = max / (textWidth + 50) + 2;
        numY = max / (textHeight + 100) + 2;
    }

    @Override
    public void draw(Canvas canvas) {
   
        if (isOne) {
   
            drawOneWaterMark(canvas);
        } else {
   
            drawFullWaterMark(canvas);
        }
    }

    private void drawOneWaterMark(Canvas canvas) {
   
        int width = getBounds().width();
        int height = getBounds().height();

        float textWidth = paint.measureText(watermarkText);
        float x = (width - textWidth) / 2;
        float y = height / 2;

        canvas.drawText(watermarkText, x, y, paint);
    }

    private void drawFullWaterMark(Canvas canvas) {
   
        for (int i = 0; i < numY; i++) {
   
            int yy = (100 >> 1) + (100 + textHeight) * i;
            for (int j = 0; j < numX; j++) {
   
                float xx = (i % 2) * (50 + textWidth) / 2 + j * (50 + textWidth);
                canvas.drawText(watermarkText, xx, yy, paint);
            }
        }
    }


    @Override
    public void setAlpha(int alpha) {
   
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
   
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
   
        return PixelFormat.TRANSLUCENT;
    }
}

这里只是简单实现下单个水印以及全局多个水印的效果, 后续水印的效果:如 旋转角度,水印的多少,水印文案的限制在继续优化吧.

设置水印的方式也很简单:

  WatermarkDrawable watermarkDrawable = new WatermarkDrawable(this,"测试", false);

获取acitvity的根布局, 设置背景drawable即可.

我们可以通过调用setForeground方法, 让水印在整个页面的前台,从而不被页面中的组件遮挡.
效果如下:
在这里插入图片描述

相关推荐

  1. 前端实现水印效果的多种方案

    2024-01-25 11:24:01       35 阅读
  2. Android 实现跑马灯效果

    2024-01-25 11:24:01       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 11:24:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 11:24:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 11:24:01       87 阅读
  4. Python语言-面向对象

    2024-01-25 11:24:01       96 阅读

热门阅读

  1. 力扣381周赛

    2024-01-25 11:24:01       54 阅读
  2. 一台PC创建多个Git平台账号

    2024-01-25 11:24:01       58 阅读
  3. Android 10.0 滑动解锁流程

    2024-01-25 11:24:01       46 阅读
  4. python学习2

    2024-01-25 11:24:01       43 阅读
  5. HJ4 字符串分隔【C语言】

    2024-01-25 11:24:01       52 阅读
  6. DQL、DCL 和mysql常用的函数

    2024-01-25 11:24:01       46 阅读
  7. 如何在 Spring Boot 中配置日志记录?

    2024-01-25 11:24:01       54 阅读
  8. Ansible手册

    2024-01-25 11:24:01       41 阅读
  9. flutter问题处理小记

    2024-01-25 11:24:01       52 阅读
  10. 三、05 ansible主机清单

    2024-01-25 11:24:01       50 阅读