Android 自定义视图 onDraw 方法在第二次启动 Activity 时无效

问题描述

我有 Activity 和那个 Activity,每当我试图在该自定义视图上绘制一些东西时,我都会有一个自定义视图,它工作正常,并且 onDraw 方法调用正常,但是当我完成()该活动并重新启动时活动我无法在其上绘制任何内容,因为该类的 onDraw 未触发。

开始活动的代码

                    Intent inten1t = new Intent(this,CameraPreviewActivity.class);
                    inten1t.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    inten1t.putExtra("width",dHeight);
                    inten1t.putExtra("height",dWidth);
                    startActivityForResult(inten1t,321);

自定义视图代码

public class PaintViewnormal extends View implements normalDrawingListener,CustomnormalDrawingListner {
public static int Brush_SIZE = 10;
public static int DEFAULT_COLOR = Color.WHITE;
public static final int DEFAULT_BG_COLOR = Color.TRANSPARENT;


private Paint mPaint;
private ArrayList<FingerPath> paths = new ArrayList<>();
public static int currentColor;
private static int backgroundColor = DEFAULT_BG_COLOR;
private int strokeWidth;

private MaskFilter memboss;
private MaskFilter mBlur;
private Bitmap mBitmap;
private Canvas mCanvas;
private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
Canvas canvas;
public static normalDrawingListener normalDrawingListener;
private float positionX;
private float positionY;
private Bitmap bitmapNew;
private String isTextLable = "";
private String textLableNew = "";
public static CustomnormalDrawingListner customnormalDrawingListner;
private boolean isFirstTime;

private final static String TAG="##PaintViewnormal";

public PaintViewnormal(Context context) {
    this(context,null);
}

public PaintViewnormal(Context context,AttributeSet attrs) {
    super(context,attrs);
    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);

    memboss = new embossMaskFilter(new float[]{1,1,1},0.4f,6,3.5f);
    mBlur = new BlurMaskFilter(5,BlurMaskFilter.Blur.norMAL);

    normalDrawingListener = this;
    customnormalDrawingListner = this;
    setwillNotDraw(false);
}

@Override
protected void onLayout(boolean b,int i,int i1,int i2,int i3) {

}

public void init(Size screensSize) {

    isFirstTime = true;

    int height;
    int width = screensSize.getWidth();

    height = RemoteUtils.newnormalHeight;
    
    if (height == 0) {
        height = screensSize.getHeight();
    }

    Log.d("##INIT_SIZE",String.valueOf(height));

    mBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);

    currentColor = DEFAULT_COLOR;
    strokeWidth = Brush_SIZE;
}


public void clear() {

    textLableNew="";
    isTextLable="clear";

    mCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
    backgroundColor = DEFAULT_BG_COLOR;
    paths.clear();
    invalidate();
}


@Override
protected void onDraw(Canvas canvas) {
    canvas.save();

    Log.d(TAG,"##ONDRAW");

    mCanvas.drawColor(backgroundColor);

    drawTextimage(mCanvas);

    for (FingerPath fp : paths) {
        mPaint.setColor(fp.color);
        mPaint.setstrokeWidth(fp.strokeWidth);
        mPaint.setMaskFilter(null);

        if (fp.emboss)
            mPaint.setMaskFilter(memboss);
        else if (fp.blur)
            mPaint.setMaskFilter(mBlur);

        mCanvas.drawPath(fp.path,mPaint);

    }

    int startX = (getWidth() - mBitmap.getWidth()) / 2;
    int startY = (getHeight() - mBitmap.getHeight()) / 2;

    Log.d(TAG,"HEIGHT : " + mBitmap.getHeight());

    canvas.drawBitmap(mBitmap,startX,startY,mBitmapPaint);
    canvas.restore();
}

@Override
public void onDrawForeground(Canvas canvas) {
    super.onDrawForeground(canvas);
    this.canvas = canvas;
}


@Override
public void onnormalDrawing(MotionEvent event,String drawingType) {

    if (drawingType.equalsIgnoreCase("delete")) {
        clear();
        return;
    }


    if (isFirstTime) {
        isTextLable = "text";
        textLableNew = "";
        positionX = event.getX();
        positionY = event.getY();
        invalidate();
        isFirstTime = false;
    }

}

@Override
public void onTextDrawn(MotionEvent event,String textLable) {

    Log.d("##norMAL_TEXT",textLable);
    isTextLable = "text";
    textLableNew = textLable;
    positionX = event.getX();
    positionY = event.getY();
    invalidate();
}

@Override
public void onImageShown(MotionEvent event,Bitmap bitmap) {

}

private void drawTextimage(Canvas canvas) {


    if (isTextLable.equalsIgnoreCase("text")) {
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        canvas.save();
        canvas.drawColor(Color.TRANSPARENT);
        paint.setstrokeWidth(1);
        paint.setColor(Color.magenta);
        paint.setTextSize(50);
        paint.setStyle(Paint.Style.FILL);
        paint.setAntiAlias(true);
        canvas.drawText(textLableNew,positionX,positionY,paint);
        canvas.restore();
    }
    if (isTextLable.equalsIgnoreCase("img")) {

        Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapNew,100,200,false);
        canvas.drawBitmap(scaledBitmap,mPaint);

    }
    if (isTextLable.equalsIgnoreCase("clear")){

        canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
    }
}

}

在我的活动初始化代码

  private void initnormalDrawing() {

    paintViewnormal = findViewById(R.id.paintviewnormal);


    displayMetrics metrics = new displayMetrics();
    getwindowManager().getDefaultdisplay().getMetrics(metrics);
    Size size = new Size(RemoteUtils.getRealSizeWidth(),RemoteUtils.getRealSizeHeight());
    if (size.getHeight() == 0) {
        size = new Size(metrics.widthPixels,metrics.heightPixels);
    }
    paintViewnormal.init(size);
    paintViewnormal.normal();
}

一切正常,一切都很好,但是每当我完成活动并重新启动活动时,onDraw 方法都不会调用

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)