Android 解决部分机型水印变黑问题

  • 前言
  • 水印实现
  • 解决部分机型水印变黑问题

前言

原来项目里边,对WebView内容增加了水印的设置。最近有好几个华为用户吐槽,水印文字太深。看了一下,根本就是纯黑,透明度都失效了。后面换了一下水印的实现方式,就解决了这个问题。

水印实现

原来水印实现的方式,就是在WebView上面放一层布局,然后布局设置一个自定义Drawable,在自定义Drawable中用paint画出水印文字,然后布局背景再设置为自定义的Drawable。

  1. WebView上放置一层水印层
<WebView        android:layout_width="match_parent"        android:layout_height="match_parent"/>    <FrameLayout        android:id="@+id/fl_watermark"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:alpha="0.3"/>
  1. 自定义水印的Drawable
public class WatermarkDrawable extends Drawable {    @Override    public void draw(@NonNull Canvas canvas) {        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setStyle(Paint.Style.FILL);        paint.setColor(Color.BLACK);        paint.setAlpha(0x1f);        Rect rect = new Rect();        int x = 0;        int y = 0;        for (int i = 0; i < 50; i++) {            for (int j = 0; j < 50; j++) {                // 画水印文字                paint.setTextSize(32);                paint.getTextBounds("Test", 0, "Test".length(), rect);                canvas.drawText("Test", x, rect.height() + y, paint);            }        }    }    @Override    public void setAlpha(int i) {    }    @Override    public void setColorFilter(@Nullable ColorFilter colorFilter) {    }    @Override    public int getOpacity() {        return 0;    }}
  1. 设置水印
@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Log.e(TAG, "onCreate");        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {            findViewById(R.id.fl_watermark).setBackground(new WatermarkDrawable());        } else {            findViewById(R.id.fl_watermark).setBackgroundDrawable(new WatermarkDrawable());        }    }

解决部分机型水印变黑问题

用上述步骤可以显示水印,可在华为的部分机型上水印变黑了。应该是paint的透明度失效了,可以转变一下,不对paint设置透明度,而是对整一个水印层设置透明度就可以解决这个问题了

  1. 去掉Drawable画笔的透明度
@Override    public void draw(@NonNull Canvas canvas) {        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setStyle(Paint.Style.FILL);        paint.setColor(Color.BLACK);//        paint.setAlpha(0x1f);去掉透明度        Rect rect = new Rect();        int x = 0;        int y = 0;        for (int i = 0; i < 50; i++) {            for (int j = 0; j < 50; j++) {                // 画水印文字                paint.setTextSize(32);                paint.getTextBounds("Test", 0, "Test".length(), rect);                canvas.drawText("Test", x, rect.height() + y, paint);            }        }    }
  1. 在布局对水印层设置透明度
    <FrameLayout        android:id="@+id/fl_watermark"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:alpha="0.3"/>

更多相关文章

  1. 几行代码,让你的app动感起来--Android(安卓)Design Support Libra
  2. Android透明度数值记录
  3. Android(安卓)Studio 一些方便使用的设置
  4. Android车轮之图片加载框架Android-Universal-Image-Loader
  5. Android(安卓)Studio--使用活动响应网页
  6. Android花样Text设置神器之SpanableString
  7. Android(安卓)高仿微信6.0主界面 带你玩转切换图标变色
  8. Android使用SVG小结
  9. Android(安卓)webview 设置cookie 保持登录状态

随机推荐

  1. 10月18日作业-MYSQL新增表及导出
  2. 香港虚拟主机是什么?有哪些推荐?需要备案吗
  3. JSON与mysql
  4. js执行机制与异步任务
  5. 为什么编程都带点强迫症?
  6. 工作中线程的启动
  7. 数学相关函数在PHP中的应用简介
  8. 软件测试人员需不需懂代码
  9. 回答两个被频繁问到的代码写法问题
  10. synchronized和Lock