Android为页面添加水印

Android实现水印背景功能(不是通过旋转canvas实现) 通过创建一个Drawable,设置成页面的背景。 大概的思路:R.android.id.content拿到布局Layout,然后添加一个FrameLayout背景有水印的View到布局文件中。 代码如下(Android9.0上测试通过) package com.example.customview.watermark; import android.app.Activity; import an... 阅读详情
AI摘要

本文详细介绍了一种使用Java代码在Android应用中动态添加水印的方法,通过自定义Drawable并在FrameLayout背景绘制倾斜重复的文本水印,实现了适配不同屏幕方向的水印效果。

1. 前言

现在市面上,有很多APP在一些关键页面上会有水印,水印一般都是一些身份相关的信息,这样可以保证截屏后的图片具有识别性,能够知道这张截图是谁截取的。

2. 具体实现

为了能够方便地在任意页面上加水印,所以应该采取用Java代码来实现,而不是在XML布局文件里面写。大概思路是,首先获取当前页面的底层布局,然后在布局最上层添加一个全屏的带有水印的FrameLayout布局。这个全屏的带有水印的FrameLayout布局,我们可以在XML写。很多博客文章都是介绍这种方式来写水印,不过大多数都没做适配,特别是横屏显示时,水印效果很不好。所以我这里用Java代码来画水印。自定义一个Drawable,把它当作水印,然后设置到FrameLayout布局的背景,这样就行了。相关代码如下所示:

package com.fantasy.blogdemo.utils;

import android.app.Activity;
import android.graphics.Canvas;
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 android.view.ViewGroup;
import android.widget.FrameLayout;

/**
 * 水印
 * <pre>
 *     author  : Fantasy
 *     version : 1.0, 2019-07-29
 *     since   : 1.0, 2019-07-29
 * </pre>
 */
public class Watermark {
    /**
     * 水印文本
     */
    private String mText;
    /**
     * 字体颜色,十六进制形式,例如:0xAEAEAEAE
     */
    private int mTextColor;
    /**
     * 字体大小,单位为sp
     */
    private float mTextSize;
    /**
     * 旋转角度
     */
    private float mRotation;
    private static Watermark sInstance;

    private Watermark() {
        mText = "";
        mTextColor = 0xAEAEAEAE;
        mTextSize = 18;
        mRotation = -25;
    }

    public static Watermark getInstance() {
        if (sInstance == null) {
            synchronized (Watermark.class) {
                sInstance = new Watermark();
            }
        }
        return sInstance;
    }

    /**
     * 设置水印文本
     *
     * @param text 文本
     * @return Watermark实例
     */
    public Watermark setText(String text) {
        mText = text;
        return sInstance;
    }

    /**
     * 设置字体颜色
     *
     * @param color 颜色,十六进制形式,例如:0xAEAEAEAE
     * @return Watermark实例
     */
    public Watermark setTextColor(int color) {
        mTextColor = color;
        return sInstance;
    }

    /**
     * 设置字体大小
     *
     * @param size 大小,单位为sp
     * @return Watermark实例
     */
    public Watermark setTextSize(float size) {
        mTextSize = size;
        return sInstance;
    }

    /**
     * 设置旋转角度
     *
     * @param degrees 度数
     * @return Watermark实例
     */
    public Watermark setRotation(float degrees) {
        mRotation = degrees;
        return sInstance;
    }

    /**
     * 显示水印,铺满整个页面
     *
     * @param activity 活动
     */
    public void show(Activity activity) {
        show(activity, mText);
    }

    /**
     * 显示水印,铺满整个页面
     *
     * @param activity 活动
     * @param text     水印
     */
    public void show(Activity activity, String text) {
        WatermarkDrawable drawable = new WatermarkDrawable();
        drawable.mText = text;
        drawable.mTextColor = mTextColor;
        drawable.mTextSize = mTextSize;
        drawable.mRotation = mRotation;

        ViewGroup rootView = activity.findViewById(android.R.id.content);
        FrameLayout layout = new FrameLayout(activity);
        layout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
        layout.setBackground(drawable);
        rootView.addView(layout);
    }

    private class WatermarkDrawable extends Drawable {
        private Paint mPaint;
        /**
         * 水印文本
         */
        private String mText;
        /**
         * 字体颜色,十六进制形式,例如:0xAEAEAEAE
         */
        private int mTextColor;
        /**
         * 字体大小,单位为sp
         */
        private float mTextSize;
        /**
         * 旋转角度
         */
        private float mRotation;

        private WatermarkDrawable() {
            mPaint = new Paint();
        }

        @Override
        public void draw(@NonNull Canvas canvas) {
            int width = getBounds().right;
            int height = getBounds().bottom;
            int diagonal = (int) Math.sqrt(width * width + height * height); // 对角线的长度

            mPaint.setColor(mTextColor);
            mPaint.setTextSize(ConvertUtils.spToPx(mTextSize)); // ConvertUtils.spToPx()这个方法是将sp转换成px,ConvertUtils这个工具类在我提供的demo里面有
            mPaint.setAntiAlias(true);
            float textWidth = mPaint.measureText(mText);

            canvas.drawColor(0x00000000);
            canvas.rotate(mRotation);

            int index = 0;
            float fromX;
            // 以对角线的长度来做高度,这样可以保证竖屏和横屏整个屏幕都能布满水印
            for (int positionY = diagonal / 10; positionY <= diagonal; positionY += diagonal / 10) {
                fromX = -width + (index++ % 2) * textWidth; // 上下两行的X轴起始点不一样,错开显示
                for (float positionX = fromX; positionX < width; positionX += textWidth * 2) {
                    canvas.drawText(mText, positionX, positionY, mPaint);
                }
            }

            canvas.save();
            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.TRANSLUCENT;
        }

    }
}

3. 使用方式

为了保证能够在当前页面的最顶层加水印,应该在 setContentView() 后面添加水印

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Watermark.getInstance().show(this, "Fantasy BlogDemo");

        // 可以自定义水印文字颜色、大小和旋转角度
        //Watermark.getInstance()
        //        .setText("Fantasy BlogDemo")
        //        .setTextColor(0xAE000000)
        //        .setTextSize(16)
        //        .setRotation(-30)
        //        .show(this);
    }

4. 效果图

竖屏效果

 

横屏效果

 

想看完整代码可以到我的GitHub上面看看BlogDemo。

 

如果想进一步交流和学习的同学,可以加一下QQ群哦!

android 在弹窗中使用PdfView / 设置Dialog大小。// 设置Dialog背景透明。// PDF 控件设置。这边的路径为网络PDF路径,可直接调用。 阅读详情

相关推荐

Android 实现自定义悬浮水印 以及屏幕自适应

一.实现android 水印覆盖屏幕效果 前段时间,这边有一个需求需要实现一个悬浮在控件上面的一个水印效果,然而网上也有很多案例,我也大概参考了一下,大部分都做不到悬浮的一个效果。于是参考网上案例,自己写了一个自定义悬浮水印。以便大家的参考。 接下来我们看一下这边的一个效果图: 二、这个效果还是挺棒的,是完全可以悬浮在控件上的,下来直接上代码了。 package com.example.edz.wannengshipeiqi.Shuiyin; import android.app.Activit

林清溯 1679

Android 为图片添加文字水印

先上图: 上代码 ------------------------MainActivity------------------------ package com.example.zhuoshi.watermarkdemo; import android.graphics.Bitmap; import android.os.Environment; import android.su...

baipenggui_bo 4890

Android 10.0 系统添加水印(仿安全模式水印)

由于项目需要,要添加商标的水印,所以功能差不多和安全模式的水印相同,进入安全模式的时候 左下角就有 安全模式 的水印 所以按照安全模式 添加水印 完成功能即可 1.查看SystemServer的相关代码找到安全模式的显示入口 路径:/frameworks/base/services/java/com/android/server/SystemServer.java private void startOtherServices() 中是启动其他服务的 而 if (safeMode) {

安卓兼职framework和app工程师的博客 2040

Android 应用加水印

Android应用加水印

OohYaYaXXXXD的博客 485

Android系统中实现水印效果

在Android应用开发中,我们经常需要为图片或者视频添加水印,以保护作品的版权和来源。本文将介绍如何在Android系统中添加水印效果,并实现类似安全模式水印的效果。以上就是实现Android系统中添加水印效果的基础步骤。通过自定义的WatermarkView控件,在onDraw方法中绘制水印文字,并动态将其添加到相应的布局中即可。需要注意的是,本文只是一个基本的实现示例,您可以根据实际需求进行扩展和优化,例如可以支持自定义水印文字、水印颜色和透明度等。Android系统中实现水印效果。

CodeJolt的博客 977

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 128

Android之页面添加水印

先上个效果图: 自定义类: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.gr...

Zachary的基地 2376

Vivado2023.2与Vitis协同开发:从Hello World到BOOT.BIN的完整流程解析

本文详细解析了使用Vivado 2023.2与Vitis协同开发ZYNQ/MPSoC平台的完整流程。从环境安装、硬件设计、软件编写、在线调试到生成独立的BOOT.BIN启动文件,手把手指导开发者完成从Hello World到系统固化的全步骤,并提供了常见问题的避坑指南,帮助初学者快速掌握软硬件协同开发的核心技能。

weixin_29197051的博客 176

Android给文档加水印,android:给整个页面添加上水印

【实例简介】这个demo实现了在整个activity上加上水印的效果,加上水印后对别的控件没有任何影响【实例截图】【核心代码】WaterMark└── WaterMark├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ └── fang│ │ ...

weixin_33321522的博客 502

STM32 FOC半周期控制延时分析与硬件同步配置

在电机矢量控制(FOC)系统中,数字控制延时是影响电流环带宽、观测器收敛性与系统稳定性的核心瓶颈。其本质源于PWM更新、ADC采样与计算执行之间的时序错配,典型表现为1.5个PWM周期的相位滞后,导致滑模观测器(SMO)失效或高速振荡。通过零阶保持(ZOH)建模可量化该延时对系统相频特性的影响,并揭示其等效为0.5u(t)+0.5u(t−1)的平滑控制律。工程上突破的关键在于重构外设协同机制——以高级定时器重复计数器(RCR0)驱动中心对齐PWM的半周期更新事件,使控制量在0.5T_PWM内生效,同步触发多

flink9streamer的博客 1131

MATLAB 开发项目实例 1000 例专栏之第37例:基于Simulink的无人机飞行控制系统设计

通过上述项目实例,我们成功地使用Simulink设计和仿真了一个无人机的飞行控制系统。这个项目展示了从无人机建模、路径规划、控制器设计到仿真验证的完整流程。Simulink的可视化和模块化特性使得系统的建模和仿真更加直观和高效。

xiaoheshang_123的博客 163

直播带货app源码,Android之页面添加水印

直播带货app源码,Android之页面添加水印相关的代码 自定义WaterMarkBgView 水印背景类: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat;

云豹网络科技 434

Android保存指定view页面内容至相册(可添加水印)

清单文件加入权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 主要保存代码 package com.demo.cn; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; imp.

weixin_43117800的博客 2151

C++面试八股文

和静态多态(又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数),其中动态多态是通过虚函数实现的,虚函数是类的成员函数,存在存储虚函数指针的表叫做虚函数表,虚函数表是一个存储类成员虚函数的指针,每个指针都指向调用它的地方,当子类调用虚函数时,就会去虚表里面找自己对应的函数指针,从而实现“谁调用、实现谁”从而实现多态。而C++符号表中的符号不是以函数名命名的,称为函数名修饰规则,虽然函数名相同,但是函数参数等其他属性不同,取的符号也不同,所以不会产生查询歧义的问题,使得函数可以重载。

qq_46676829的博客 904

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,

KJ.JK 1071

页面加水印

【代码】页面加水印。

xiaoerbuyu1233的博客 159

面向非平行语料的语音转换技术综述

摘要语音转换是语音及人工智能领域的一项研究课题,其目标是在保持源语音内容不变的情况下改变语音的音色,使其听上去像是由另一个目标说话人说出的,同时还需保证语音的质量和自然度。面向非平行语料的语音转换技术是当下的热门研究内容,其使用非平行的多说话人语音数据集进行模型训练,能完成多对多以及任意对任意的语音转换。对近年来面向非平行语料的语音转换进行了全面的总结和分析。首先概述了早期面向平行语料的语音转换及其缺陷,然后对当下面向非平行语料的语音转换的各类实现方法进行介绍和对比分析,最后对语音转换技术进行了总结和展望。

qq_61890005的博客 829

Android添加水印功能

import android.app.Activity; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android...

weixin_42345592的博客 1344

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android原生界面添加水印

工具类: package com.fantasy.blogdemo.utils; import android.app.Activity; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; imp.

wwslina的博客 1046

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

页面中满屏水印

Activity中添加水印

tianhongfan10106的专栏 785

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

harmony--页面水印控件

给页面添加水印,覆盖于整个页面之上,不影响页面操作 import ohos.agp.components.Component; import ohos.agp.render.Canvas; import ohos.agp.render.Paint; import ohos.agp.utils.Color; import ohos.agp.window.service.Display; import ohos.agp.window.service.DisplayAttributes; import..

qq_37862735的博客 317

终极安卓PDF查看器指南:如何用PDFView打造流畅阅读体验

**PDFView**是一款专为安卓平台设计的高效PDF查看器库,采用自定义View实现,支持滑动浏览、高清缩放、三级缓存及水印添加等核心功能,让移动端PDF阅读体验更流畅。无论是本地文件还是网络文档,都能轻松加载,最低兼容Android 5.0系统,是开发者集成PDF功能的理想选择。 ## ???? 为什么选择PDFView?核心功能亮点 ### ✅ 流畅阅读体验 - **多级缓存机制**:通过...

gitblog_00117的博客 1169

PDF工具:14项实用功能,轻松搞定文档处理!

比如重新排序功能,操作起来简单得令人惊叹。您只需长按 PDF 文件,然后将其拖动到理想位置,就能轻松完成页面的重新排列。不仅如此,软件的加密和添加水印功能也表现出色,完美满足了我们日常办公和学习的刚需。这款软件完全免费,无需登录就能直接畅享其丰富功能。它拥有合并 PDF/图像、重新排序/旋转/删除页面、提取图像、分割 PDF、密码保护等多达 14 项实用功能。这款软件不仅功能齐全,还完全免费,堪称是隐藏在手机里的宝藏工具!的 PDF 工具,绝对能让你眼前一亮!

qingyang2020的博客 241

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

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

weixin_36165569的博客 1757

【亲测免费】 PDFView 项目常见问题解决方案

PDFView 是一个安卓平台的 PDF 查看器,支持滑动、缩放、三级缓存、放大展示高清图等功能。该项目主要使用 Kotlin 和 Java 语言进行开发。Kotlin 是项目的主要编程语言,占比约为 91.4%,而 Java 占比约为 8.6%。 #### 2. 新手在使用项目时需要特别注意的3个问题及详细解决步骤 **问题1:如何正确引入项目依赖?** **解决步骤:** 1. 在项目的...

gitblog_01265的博客 529
上一篇: 使用Java实现AES加密解密
下一篇: HTTPS相关资料汇总
Fantasy丶Lin
博客等级 码龄11年 92粉丝 59原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值