Android 水印效果

news2024/12/23 23:21:33

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方法, 让水印在整个页面的前台,从而不被页面中的组件遮挡.
效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QQ云端机器人登录系统php源码

这款源码主要是针对群机器人爱好者的&#xff0c;这是一个通过对接挂机宝里面机器人框架的一个网页站点&#xff0c;用户通过网页登录 QQ 账号至挂机宝里面框架&#xff08;可扫码登录、账密登录、跳转 QQ 快捷登录&#xff09;&#xff0c;无需通过机器人即可实现登录&#xf…

C/S客户端安装卸载更新

今天这个我一直没想写&#xff0c;因为现在好像c/s客户端的安装比较少 &#xff0c;应该很多公司都没有了&#xff0c;但是erp&#xff0c;一些自己公司内部使用的可能比较多&#xff0c;但是现在都比较倾向于BS结构的了&#xff0c;浅浅的了解下C/S的安装卸载更新吧~ 1、安装 …

【算法Hot100系列】合并区间

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

matlab GUI实现PID控制器参数配置

1、内容简介 略 39-可以交流、咨询、答疑 2、内容说明 略 3、 基于GUI的PID研究 本例子中设计一个PID控制器来研究不同参数对输出结果的影响&#xff0c;PID控制器由比例单元 P、积分单元 I 和微分单元 D 组成。PID 控制器是一个在工业控制应用中常见的反馈回路部件&…

消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

问题概览 目前主流的消息队列技术&#xff08;MQ技术&#xff09;分为RabbitMQ和Kafka&#xff0c;其中深蓝色为只要是MQ&#xff0c;一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ的应用场景 MQ主要提供的功能为&#xff1a;异…

冬天喝羊奶身体会发生什么变化?

冬天喝羊奶身体会发生什么变化&#xff1f; 冬天喝羊奶的身体变化&#xff0c;大家都应该知道吧&#xff1f;那么冬天喝羊奶到底会发生什么样的变化呢&#xff1f;是好是坏呢&#xff1f;今天小编羊大师就带大家来一起探讨一下。 冬天天气寒冷&#xff0c;人们往往会选择喝一…

CTU Open 2004 电力

题目描述 求一个无向图图删除一个点之后&#xff0c;连通块最多有多少。 输入输出格式 输入格式&#xff1a; 多组数据。第一行两个整数 P,C 表示点数和边数。 接下来 C 行每行两个整数 p1,p2&#xff0c;表示 p1 与 p2 有边连接&#xff0c;保证无重边。读入以 0 0 结束。 …

大数据数据可视化工具ECharts,从入门到精通!

介绍&#xff1a;ECharts是一个强大的数据可视化图表库&#xff0c;它基于JavaScript开发&#xff0c;并具有丰富的特性和灵活性。 多平台支持&#xff1a;ECharts可以在PC和移动设备上流畅运行&#xff0c;它对移动端进行了优化&#xff0c;确保在不同设备上都有良好的展示效果…

【边缘计算】TA的基本概念,以及TA的挑战和机遇

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】序列文章&#xff0c;这一次的话题是《边缘计算的挑战和机遇》 文章将以博主的角度进行讲述&#xff0c;理解和水平有限&#xff0c;不足之处&#xff0c;望指正。 目录 背景基本概念挑战…

【UE PS】方向标尺制作系列 01-制作图片素材

目录 步骤 一、制作标尺 1.1、制作标尺线部分 1.2、制作文字部分 1.3、制作角度部分 二、制作标尺背景 三、制作Mask 四、制作指针Icon 步骤 一、制作标尺 1.1、制作标尺线部分 首先需要制作如下图片素材 1. 打开PS&#xff0c;新建一个文档&#xff0c;设置宽度…

Qt编写linux系统onvif工具(支持预览/云台/预置位/录像等)

一、功能特点 广播搜索设备&#xff0c;支持IPC和NVR&#xff0c;依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址&#xff0c;比如主码流地址、子码流地址。可对每个设备设…

架构师之路(十五)计算机网络(网络层协议)

前置知识&#xff08;了解&#xff09;&#xff1a;计算机基础。 作为架构师&#xff0c;我们所设计的系统很少为单机系统&#xff0c;因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 ARP协议 地址解…

【Flink-1.17-教程】-【五】Flink 中的时间和窗口(1)窗口(Window)

【Flink-1.17-教程】-【五】Flink 中的时间和窗口&#xff08;1&#xff09;窗口&#xff08;Window&#xff09; 1&#xff09;窗口的概念2&#xff09;窗口的分类2.1.按照驱动类型分2.2.按照窗口分配数据的规则分类2.2.1.滚动窗口&#xff08;Tumbling Window&#xff09;2.2…

代码随想录算法训练营第37天 | 738.单调递增的数字 968.监控二叉树 总结

目录 738.单调递增的数字 &#x1f4a1;解题思路 &#x1f4bb;实现代码 968.监控二叉树 &#x1f4a1;解题思路 确定遍历顺序 如何隔两个节点放一个摄像头 &#x1f4bb;实现代码 总结 738.单调递增的数字 题目链接&#xff1a;738.单调递增的数字 给定一个非负…

《深入解析Java虚拟机:从JVM体系结构到垃圾回收算法》

文章目录 JVM体系结构JVM的组成 类加载器Class Loader类加载器的作用双亲委派机制JVM自带三个类加载器Bootstrap ClassLoader-根加载器ExtClassLoader-扩展加载器AppClassLoader-应用类加载器 Java历史-沙箱安全机制沙箱概念沙箱的作用本地代码和远程代码沙箱安全机制模型JDK1 …

Sqlite真空命令VACUUM

之前在项目中使用了sqlite数据库&#xff0c;当日志变大时&#xff0c;执行CRUD操作就会变慢 后来尝试删除7天前的记录进行优化 delete from XX_CollectData where CreateTime<2024-01-24 发现sqlite文件的大小就没有变化&#xff0c;delete命令只是逻辑删除&#xff0c;…

web项目开发的基本过程

一、背景 web项目开发基本过程一般由需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;数据库设计&#xff0c;编码&#xff0c;测试&#xff0c;发布上线这几个过程。这就是经典的瀑布模型。但是随着系统的复杂度越来越高&#xff0c;团队人员技术栈分工越来越小…

[algorithm] 自动驾驶 规划 非线性优化学习系列之1 :车辆横向运动动力学详细解释

写在前面 最近时空联合规划很火&#xff0c;想学习。由于在学校主打学习新能源电力电子方向&#xff0c;转行后也想好好零散的知识体系。计划从车辆运动动力学习&#xff0c;模型预测控制&#xff08;经典控制目前看主打应用&#xff0c;不会再去深入&#xff09;&#xff0c;…

下载音频(MP3)解决跨域,不跳转界面,直接下载

需求 项目需求&#xff0c;将通话记录下载下来&#xff0c;要求不跳转界面直接下载。 效果 代码 // 下载录音downloadRecording(data) {const url data.urlconst fileName 录音.mp3this.getOSSBlobResource(url).then(res > {this.saveFile(res, fileName)})},getOSSBlo…

车载显示,“激斗”与“换代”

编者按&#xff1a;车载显示&#xff0c;正在进入新一轮变革周期。 车载显示作为汽车智能化的重要交互终端&#xff0c;在过去几年&#xff0c;持续受益车企的大屏化、多屏化配置趋势&#xff0c;部分头部厂商赚得盆满钵满。 比如&#xff0c;作为京东方旗下唯一的车载显示模组…