Android Studio更新现在出现渲染问题

问题描述

自从Android Studio在几天前更新以来,我一直遇到渲染问题。emuator将无法运行该应用程序,并会继续崩溃。我相信也许我已经为paintView使用的代码现在已被严重弃用了?问题栈是:

java.lang.NullPointerException
at com.example.drawnfire.paintView.onDraw_Original(paintView.java:112)
at com.example.drawnfire.paintView.onDraw(paintView.java)
at android.view.View.draw_Original(View.java:21443)
at android.view.View_Delegate.draw(View_Delegate.java:56)
at android.view.View.draw(View.java:21417)
at android.view.View.draw_Original(View.java:21317)
at android.view.View_Delegate.draw(View_Delegate.java:68)
at android.view.View.draw(View.java:21089)
at android.view.ViewGroup.drawChild(ViewGroup.java:4388)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4149)
at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1963)
at android.view.View.draw_Original(View.java:21315)
at android.view.View_Delegate.draw(View_Delegate.java:68)
at android.view.View.draw(View.java:21089)
at android.view.ViewGroup.drawChild(ViewGroup.java:4388)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4149)
at android.view.View.draw_Original(View.java:21315)
at android.view.View_Delegate.draw(View_Delegate.java:68)
at android.view.View.draw(View.java:21089)
at android.view.ViewGroup.drawChild(ViewGroup.java:4388)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4149)
at android.view.View.draw_Original(View.java:21315)
at android.view.View_Delegate.draw(View_Delegate.java:68)
at android.view.View.draw(View.java:21089)
at android.view.ViewGroup.drawChild(ViewGroup.java:4388)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4149)
at android.view.View.draw_Original(View.java:21446)
at android.view.View_Delegate.draw(View_Delegate.java:56)
at android.view.View.draw(View.java:21417)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.renderAndbuildresult(RenderSessionImpl.java:552)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:449)
at com.android.layoutlib.bridge.BridgeRenderSession.render(BridgeRenderSession.java:123)
at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:143)
at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:125)
at com.android.tools.idea.rendering.RenderTask.lambda$null$11(RenderTask.java:966)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

,此代码所指的是:

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.displayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Toast;
import java.util.ArrayList;

public class paintView extends View {

    public static int Brush_SIZE = 10;
    public static final int DEFAULT_COLOR = Color.RED;
    public static final int DEFAULT_BG_COLOR = Color.WHITE;
    private static final float TOUCH_TOLERANCE = 4;
    private float mX,mY;
    public LayoutParams params;
    private Path mPath;
    private Paint mPaint;
    private int currentColor;
    private int backgroundColor = DEFAULT_BG_COLOR;
    private int strokeWidth;
    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    private ArrayList<Draw> paths = new ArrayList<>();
    private ArrayList<Draw> undo = new ArrayList<>();

    public paintView(Context context) {
        super(context);
        init();
    }

    public paintView(Context context,AttributeSet attrs) {
        super(context,attrs);
        init();
    }

    public paintView(Context context,AttributeSet attrs,int defStyle) {
        super(context,attrs,defStyle);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(DEFAULT_COLOR);
        mPaint.setStyle(Paint.Style.stroke);
        mPaint.setstrokeJoin(Paint.Join.ROUND);
        mPaint.setstrokeCap(Paint.Cap.ROUND);
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xff);

        params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
    }

    public void clear() {
        backgroundColor = DEFAULT_BG_COLOR;
        paths.clear();
        invalidate();
    }

    public void undo() {
        if (paths.size() > 0) {
            undo.add(paths.remove(paths.size() - 1));
            invalidate(); // add
        } else {
            Toast.makeText(getContext(),"nothing to undo",Toast.LENGTH_LONG).show();
        }
    }

    public void redo () {
        if (undo.size() > 0) {
            paths.add(undo.remove(undo.size() - 1));
            invalidate(); // add
        } else {
            Toast.makeText(getContext(),Toast.LENGTH_LONG).show();
        }
    }

    public void setstrokeWidth (int width) {
        strokeWidth = width;
    }

    public void setColor (int color) {
        currentColor = color;
    }

    public void initialise(displayMetrics displayMetrics) {
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;

        mBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        currentColor = DEFAULT_COLOR;
        strokeWidth = Brush_SIZE;
    }

    protected void onDraw(Canvas canvas) {
        canvas.save();
        mCanvas.drawColor(backgroundColor);

        for (Draw draw : paths) {
            mPaint.setColor(draw.color);
            mPaint.setstrokeWidth(draw.strokeWidth);
            mPaint.setMaskFilter(null);
            mCanvas.drawPath(draw.path,mPaint);
        }
        canvas.drawBitmap(mBitmap,mBitmapPaint);
        canvas.restore();
    }

    private void touchStart(float x,float y) {
        mPath = new Path();
        Draw draw = new Draw(currentColor,strokeWidth,mPath);

        paths.add(draw);
        mPath.reset();
        mPath.moveto(x,y);
        mX = x;
        mY = y;
    }

    private void touchMove(float x,float y) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);

        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX,mY,(x + mX) / 2,(y + mY) / 2);
            mX = x;
            mY = y;
        }
    }

    private void touchUp() {
        mPath.lineto(mX,mY);
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchStart(x,y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touchUp();
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(x,y);
                invalidate();
                break;
        }
        return true;
    }
}

我为此道歉,但是我对此失去了理智。

解决方法

Android Studio 4.0.0可以正常运行,但是4.1.0和4.2.0出现错误,并且不稳定。所以请使用Android Studio 4.0.0谢谢