Android 解决部分机型水印变黑问题
前言
原来项目里边,对WebView内容增加了水印的设置。最近有好几个华为用户吐槽,水印文字太深。看了一下,根本就是纯黑,透明度都失效了。后面换了一下水印的实现方式,就解决了这个问题。
水印实现
原来水印实现的方式,就是在WebView上面放一层布局,然后布局设置一个自定义Drawable,在自定义Drawable中用paint画出水印文字,然后布局背景再设置为自定义的Drawable。
- 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"/>
- 自定义水印的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;
}
}
- 设置水印
@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设置透明度,而是对整一个水印层设置透明度就可以解决这个问题了
- 去掉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);
}
}
}
- 在布局对水印层设置透明度
<FrameLayout
android:id="@+id/fl_watermark"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.3"/>