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

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"/>

猜你喜欢

转载自blog.csdn.net/weixin_45519413/article/details/107673305