/**

  • 设置水印字体大小(单位:px)

  • @param textSize 字体大小(默认:42px)

*/

public void setTextSize(int textSize) {

mTextSize = textSize;

mTextPaint.setTextSize(30);

postInvalidate();

}

/**

  • 同步设置水印字体大小(单位:px)

  • @param textSize 字体大小(默认:42px)

*/

void setSyncTextSize(int textSize) {

if (mSync) {

setTextSize(30);

}

}

/**

  • 设置水印字体是否粗体

  • @param textBold 是否粗体(默认:false)

*/

public void setTextBold(boolean textBold) {

mTextBold = textBold;

mTextPaint.setTypeface(mTextBold ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);

postInvalidate();

}

/**

  • 同步设置水印字体是否粗体

  • @param textBold 是否粗体(默认:false)

*/

void setSyncTextBold(boolean textBold) {

if (mSync) {

setTextBold(textBold);

}

}

/**

  • 设置水印X轴偏移量(单位:px)

  • @param dx X轴偏移量(默认:100px)

*/

public void setDx(int dx) {

this.mDx = dx;

postInvalidate();

}

/**

  • 同步设置水印X轴偏移量(单位:px)

  • @param dx X轴偏移量(默认:100px)

*/

void setSyncDx(int dx) {

if (mSync) {

setDx(dx);

}

}

/**

  • 设置水印Y轴偏移量(单位:px)

  • @param dy Y轴偏移量(默认:240px)

*/

public void setDy(int dy) {

this.mDy = dy;

postInvalidate();

}

/**

  • 同步设置水印Y轴偏移量(单位:px)

  • @param dy Y轴偏移量(默认:240px)

*/

void setSignDy(int dy) {

if (mSync) {

setDy(dy);

}

}

/**

  • 设置水印对齐方式

  • @param align 对齐方式(默认:Center)

*/

public void setAlign(Paint.Align align) {

this.mAlign = align;

postInvalidate();

}

/**

  • 同步设置水印对齐方式

  • @param align 对齐方式(默认:Center)

*/

void setSignAlign(Paint.Align align) {

if (mSync) {

setAlign(align);

}

}

/**

  • 销毁相关页面时调用(切记)

*/

public void onDestroy() {

if (mSync) {

WaterMarkManager.LIST.remove(this);

}

}

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

return false;

}

@SuppressLint(“ClickableViewAccessibility”)

@Override

public boolean onTouchEvent(MotionEvent event) {

return false;

}

}

package com.hkdc.commonlib.warkmark;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.graphics.Paint;

import android.view.LayoutInflater;

import com.hkdc.commonlib.R;

import java.util.ArrayList;

import java.util.List;

/**

  • @author Leon (wshk729@163.com)

  • @date 2018/8/24

*/

public class WaterMarkManager {

static WaterMarkInfo INFO = null;

static String[] CONTENT = null;

static List LIST = new ArrayList<>();

/**

  • 设置水印全局配置信息

  • @param info 配置信息

*/

public static void setInfo(WaterMarkInfo info) {

INFO = info;

}

/**

  • 获取一个满屏水印View

  • @param activity activity

*/

@SuppressLint(“InflateParams”)

public static WaterMarkView getView(Activity activity) {

return (WaterMarkView) LayoutInflater.from(activity).inflate(R.layout.view_water_mark, null);

}

/**

  • WaterMarkInfo初始化判断

*/

private static void assertInitialized() {

if (INFO == null) {

INFO = WaterMarkInfo.create().generate();

}

}

/**

  • 同步设置全部水印文字信息

  • @param content 文字信息

*/

public static void setText(String… content) {

assertInitialized();

CONTENT = content;

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSyncText(content);

}

}

}

}

/**

  • 同步设置全部水印倾斜角度

  • @param degrees 倾斜角度(默认:-30)

*/

public static void setDegrees(int degrees) {

assertInitialized();

INFO.setDegrees(degrees);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSyncDegrees(degrees);

}

}

}

}

/**

  • 同步设置全部水印字体颜色

  • @param textColor 字体颜色(默认:#33000000)

*/

public static void setTextColor(int textColor) {

assertInitialized();

INFO.setTextColor(textColor);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSyncTextColor(textColor);

}

}

}

}

/**

  • 同步设置全部水印字体大小(单位:px)

  • @param textSize 字体大小(默认:42px)

*/

public static void setTextSize(int textSize) {

assertInitialized();

INFO.setTextSize(textSize);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSyncTextSize(textSize);

}

}

}

}

/**

  • 同步设置全部水印字体是否粗体

  • @param textBold 是否粗体(默认:false)

*/

public static void setTextBold(boolean textBold) {

assertInitialized();

INFO.setTextBold(textBold);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSyncTextBold(textBold);

}

}

}

}

/**

  • 同步设置全部水印X轴偏移量(单位:px)

  • @param dx X轴偏移量(默认:100px)

*/

public static void setDx(int dx) {

assertInitialized();

INFO.setDx(dx);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSyncDx(dx);

}

}

}

}

/**

  • 同步设置全部水印Y轴偏移量(单位:px)

  • @param dy Y轴偏移量(默认:240px)

*/

public static void setDy(int dy) {

assertInitialized();

INFO.setDy(dy);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSignDy(dy);

}

}

}

}

/**

  • 同步设置全部水印对齐方式

  • @param align 对齐方式(默认:Center)

*/

public static void setAlign(Paint.Align align) {

assertInitialized();

INFO.setAlign(align);

if (LIST.size() > 0) {

for (WaterMarkView view : LIST) {

if (view != null) {

view.setSignAlign(align);

}

}

}

}

}

view_water_mark.xml

<?xml version="1.0" encoding="utf-8"?>

<com.commonlib.WaterMarkView

xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“match_parent”

android:layout_height=“match_parent”/>

import android.graphics.Color;

import android.graphics.Paint;

/**

  • @author Leon (wshk729@163.com)

  • @date 2018/8/24

*/

public class WaterMarkInfo {

private int mDegrees;

private int mTextColor;

private int mTextSize;

private boolean mTextBold;

private int mDx;

private int mDy;

private Paint.Align mAlign;

private WaterMarkInfo(int degrees, int textColor, int textSize, boolean textBold, int dx, int dy, Paint.Align align) {

mDegrees = degrees;

mTextColor = textColor;

mTextSize = textSize;

mTextBold = textBold;

mDx = dx;

mDy = dy;

mAlign = align;

}

public int getDegrees() {

return mDegrees;

}

public int getTextColor() {

return mTextColor;

}

public int getTextSize() {

return mTextSize;

}

public int getDx() {

return mDx;

}

public int getDy() {

return mDy;

}

public Paint.Align getAlign() {

return mAlign;

}

public int getAlignInt() {

switch (mAlign) {

case LEFT:

return 0;

case RIGHT:

return 2;

default:

return 1;

}

}

public boolean isTextBold() {

return mTextBold;

}

void setDegrees(int degrees) {

mDegrees = degrees;

}

void setTextColor(int textColor) {

mTextColor = textColor;

}

void setTextSize(int textSize) {

mTextSize = textSize;

}

void setTextBold(boolean textBold) {

mTextBold = textBold;

}

void setDx(int dx) {

mDx = dx;

}

void setDy(int dy) {

mDy = dy;

}

void setAlign(Paint.Align align) {

this.mAlign = align;

}

public static Builder create() {

return new Builder();

}

public static class Builder {

private int mDegrees;

private int mTextColor;

private int mTextSize;

private boolean mTextBold;

private int mDx;

private int mDy;

private Paint.Align mAlign;

private Builder() {

mDegrees = -30;

mTextColor = Color.parseColor(“#33000000”);

mTextSize = 35;

mTextBold = false;

mDx = 100;

mDy = 240;

mAlign = Paint.Align.CENTER;

}

/**

  • 设置水印文字倾斜度

  • @param degrees 文字倾斜度(默认:-30)

  • @return Builder

*/

public Builder setDegrees(int degrees) {

mDegrees = degrees;

return this;

}

/**

  • 设置水印文字颜色

  • @param textColor 文字颜色(默认:#33000000)

  • @return Builder

*/

public Builder setTextColor(int textColor) {

mTextColor = textColor;

return this;

}

/**

  • 设置水印文字大小(单位:px)

  • @param textSize 文字大小(默认:42px)

  • @return Builder

*/

public Builder setTextSize(int textSize) {

mTextSize = textSize;

return this;

}

/**

  • 设置水印文字是否加粗

  • @param textBold 文字加粗(默认:false)

  • @return Builder

*/

public Builder setTextBold(boolean textBold) {

mTextBold = textBold;

return this;

}

/**

  • 设置水印文字X轴间距(单位:px)

  • @param dx 文字X轴间距(默认:100px)

  • @return Builder

*/

public Builder setDx(int dx) {

mDx = dx;

return this;

}

/**

  • 设置水印文字Y轴间距(单位:px)

  • @param dy 文字Y轴间距(默认:240px)

  • @return Builder

*/

public Builder setDy(int dy) {

mDy = dy;

return this;

}

/**

  • 设置水印文字对齐方式

  • @param align 对齐方式(默认:Center)

  • @return Builder

*/

public Builder setAlign(Paint.Align align) {

mAlign = align;

return this;

}

/**

  • 生成水印全局配置信息

  • @return 配置信息

*/

public WaterMarkInfo generate() {

return new WaterMarkInfo(mDegrees, mTextColor, mTextSize, mTextBold, mDx, mDy, mAlign);

}

}

}

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 labels;

private Context context;

private int degress;//角度

private int fontSize;//字体大小 单位sp

/**
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

int fontSize;//字体大小 单位sp

/**
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-rlxt8S8H-1712352304109)]

[外链图片转存中…(img-3OGcGziQ-1712352304110)]

[外链图片转存中…(img-hVrokS8S-1712352304110)]

[外链图片转存中…(img-Il0ZKn67-1712352304110)]

[外链图片转存中…(img-yUQxMUZ5-1712352304111)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-nDWGGPWU-1712352304111)]

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

[外链图片转存中…(img-mi8Etdkm-1712352304111)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐