Android开发绘制白色Bitmap显示却是黑的而其他颜色显示正常的解决方法

Android开发绘制白色Bitmap显示却是黑的而其他颜色显示正常的解决方法

//实现绘制白色Bitmap的代码如下:
public class DrawView extends View {
    private Bitmap bitmap;
    private Paint paint;

    public DrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        paint = new Paint(Paint.DITHER_FLAG);
        paint.setColor(Color.WHITE);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        bitmap = createBitmap(getMeasuredWidth(), getMeasuredHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(bitmap, 0, 0, paint);
    }

    private Bitmap createBitmap(int width, int height) {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.eraseColor(Color.WHITE);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(bitmap, null, new Rect(0, 0, width, height), paint);
        return bitmap;
    }
}

经过各种排查和测试验证,终于找到原因竟然是手机开启深色模式的锅。。。白色嘛,想想开启深色模式有影响也是有道理的,那居然知道原因了,那就只能让app不跟随系统深色模式了,解决方法如下:

//解决问题之后的代码如下:
public class DrawView extends View {
    private Bitmap bitmap;
    private Paint paint;

    public DrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        paint = new Paint(Paint.DITHER_FLAG);
        paint.setColor(Color.WHITE);
        //新增下面三行代码,让app不跟随系统进入深色模式,这样就可以解决问题了
        //如果不想代码里设置,也可以在themes.xml文件里设置style主题为Light样式的
        //并且添加<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
            setForceDarkAllowed(false);
        }
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        bitmap = createBitmap(getMeasuredWidth(), getMeasuredHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(bitmap, 0, 0, paint);
    }

    private Bitmap createBitmap(int width, int height) {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.eraseColor(Color.WHITE);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(bitmap, null, new Rect(0, 0, width, height), paint);
        return bitmap;
    }
}
posted @   yongfengnice  阅读(800)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2021-07-14 Android开发为什么主线程可以一直运行而不会退出来
点击右上角即可分享
微信分享提示