美文网首页
Android 水印功能(适合游戏)

Android 水印功能(适合游戏)

作者: flu鲁少 | 来源:发表于2021-02-05 15:08 被阅读0次
    适合单个Activity 的水印功能。
    package com.flushao.util;
    
    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.util.Log;
    
    import androidx.annotation.IntRange;
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    
    import java.util.List;
    
    /**
     * @author flushao
     * <p>
     * 添加水印的背景图
     */
    public class WaterMarkBgView extends Drawable {
    
        private final Paint paint = new Paint();
        private List<String> labels;
        private Context context;
        private int degrees = 0;        // 角度
        private int fontSize = 12;       // 字体大小 单位sp
        private int line = 8;       // 多少行
        private int lineNumb = 10;  // 每行多少个
    
        /**
         * @param context  上下文
         * @param labels   水印文字列表
         * @param degrees  水印角度
         * @param fontSize 水印文字大小
         */
        public WaterMarkBgView(Context context, List<String> labels, int degrees, int fontSize) {
            this(context, labels, 5, 6, degrees, fontSize);
        }
    
        /**
         * @param context  上下文
         * @param labels   水印文字列表
         * @param degrees  水印角度
         * @param line     行数
         * @param lineNumb 每行水印数
         * @param fontSize 水印文字大小
         */
        public WaterMarkBgView(Context context, List<String> labels, int line, int lineNumb, int degrees, int fontSize) {
            this.labels = labels;
            this.context = context;
            this.degrees = degrees;
            this.fontSize = fontSize;
            this.line = line;
            this.lineNumb = lineNumb;
            // 做一些边缘检测
    
            if (fontSize > 24) {
                this.fontSize = 24;
                Logd.e("WaterMarkBgView", "水印字体过大将影响观感,建议使用 16 ~ 20 !!!!");
                try {
                    throw new Exception("水印字体过大将影响观感,建议使用 16 ~ 20 !!!");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (degrees > 30) {
                this.degrees = 30;
                Logd.e("WaterMarkBgView", "建议水印倾斜角度设置在 20 度!!!!");
                try {
                    throw new Exception("建议水印倾斜角度设置在 20 度!!!!");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if (degrees < -30) {
                this.degrees = -30;
                Logd.e("WaterMarkBgView", "建议水印倾斜角度设置在 20 度!!!!");
                try {
                    throw new Exception("建议水印倾斜角度设置在 20 度!!!!");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        public static int sp2px(Context context, float spValue) {
            final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
            return (int) (spValue * fontScale + 0.5f);
        }
    
        @Override
        public void draw(@NonNull Canvas canvas) {
    
            int width = getBounds().right;
            int height = getBounds().bottom;
    
            // 画布背景色
            canvas.drawColor(Color.parseColor("#00000000"));
            // 水印文字的颜色
            paint.setColor(Color.parseColor("#AEAEAE"));
            paint.setAntiAlias(true);
            paint.setAlpha(60);
            paint.setTextSize(sp2px(context, fontSize));
            canvas.save();
            canvas.rotate(degrees);
            // 开始绘制水印
            float textWidth = paint.measureText(labels.get(0));
            // 每一个的起始高度为: (总高度 - (最后一条的高度 + 每个水印列表的间距)  ) / 水印条数 - 1
            float everyTextLineHeight = (float) (height - (sp2px(context, fontSize)  * labels.size() + 5* labels.size())) / (line - 1);
            float everyTextWidth = (width - textWidth) / (lineNumb - 1);
            if (degrees == 0) {
                // 没角度直接画
                for (int i = 0; i < line; i++) {
                    float positionY = i * everyTextLineHeight + sp2px(context, fontSize);
                    for (int j = 0; j < lineNumb; j++) {
                        float positionX = j * everyTextWidth;
                        for (int l = 0; l < labels.size(); l++) {
                            canvas.drawText(labels.get(l), positionX, positionY + sp2px(context, fontSize) * l + 3, paint);
                        }
                    }
                }
            }else {
                // 如果有角度,那就把其他三个象限都画上,并且以左上为起点
                for (int i = 0; i < line * 2; i++) {
                    float positionY = i * everyTextLineHeight + sp2px(context, fontSize) - height;
                    for (int j = 0; j < lineNumb * 2; j++) {
                        float positionX = j * everyTextWidth - width;
                        for (int l = 0; l < labels.size(); l++) {
                            canvas.drawText(labels.get(l), positionX, positionY + sp2px(context, fontSize) * l + 5, paint);
                        }
                    }
                }
            }
    
            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;
        }
    }
    

    相关文章

      网友评论

          本文标题:Android 水印功能(适合游戏)

          本文链接:https://www.haomeiwen.com/subject/abtgtltx.html