Android实现文字水印效果支持多行水印
一、背景与原理
在Android应用开发中,为图片或视频添加文字水印是一种常见的需求,文字水印不仅可以用来标识内容所有者,还可以用于版权声明等用途,本文将详细介绍如何在Android中实现支持多行文字的水印效果。
1. 使用TextView占据整个页面
为了实现文字水印效果,我们可以使用一个TextView
来占据整个页面,并在其基础上添加水印,这种方式简单易行,且可以灵活控制水印的位置和样式。
2. Canvas和Paint类
在Android中,Canvas
和Paint
类是进行图形绘制的基础工具,通过重载Drawable
类的draw
方法,我们可以利用Canvas
和Paint
来实现复杂的水印效果。
二、实现步骤
1. 创建自定义Drawable类
我们需要创建一个自定义的Drawable
类WaterMarkBg
,该类继承自Drawable
并重载draw
方法。
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; public class WaterMarkBg extends Drawable { private Paint paint = new Paint(); private List<String> labels; private Context context; private int degree; // 角度 private int fontSize; // 字体大小,单位sp /** * 初始化构造 * @param context 上下文 * @param labels 水印文字列表,支持多行显示 * @param degree 水印角度 * @param fontSize 水印文字大小 */ public WaterMarkBg(Context context, List<String> labels, int degree, int fontSize) { this.labels = labels; this.context = context; this.degree = degree; 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(degree); 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); } }
2. 在Activity中使用自定义Drawable
我们在MainActivity
中使用这个自定义的Drawable
类作为背景。
import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainActivity extends AppCompatActivity { private TextView bg_tv; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bg_tv = findViewById(R.id.bg_tv); List<String> labels = new ArrayList<>(); labels.add("用户名:张三"); labels.add("日期:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date())); labels.add("不可扩散"); bg_tv.setBackgroundDrawable(new WaterMarkBg(MainActivity.this, labels, -30, 13)); } }
三、代码分析与优化建议
1.WaterMarkBg
类详解
成员变量:paint
,labels
,context
,degree
,fontSize
,分别用于绘制、存储水印文字、上下文环境、旋转角度和字体大小。
构造函数:初始化成员变量。
Canvas
上绘制水印,通过循环和计算位置,实现多行水印效果。
辅助方法:sp2px
用于将sp转换为px,确保文字大小在不同设备上的一致性。
2. 性能优化建议
减少重复对象创建:在draw
方法中频繁创建对象可能会影响性能,可以考虑复用对象或使用对象池技术。
异步绘制:如果水印绘制过程复杂且耗时,可以考虑将其放在异步线程中执行,避免阻塞主线程。
缓存机制:对于不会频繁改变的水印内容,可以使用缓存机制减少重复绘制。
本文介绍了在Android中实现支持多行文字的水印效果的方法,通过自定义Drawable
类并重载draw
方法,结合Canvas
和Paint
实现复杂的水印效果,这种方法具有灵活性高、易于扩展的优点,未来可以进一步优化性能,并探索更多的应用场景,如视频水印、动态水印等。
以上内容就是解答有关“android实现文字水印效果 支持多行水印”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1278776.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复