2

I created a painting view and when I rotate my phone my paiting always is clearing and I do not have idea why is clearing .

This is my whole activity :

public class SignatureActivity extends Activity implements Handler.Callback {

    File mCurrentPhotoPath;
    private FrameLayout drawerBox;
    private Button save, clear;
    private DrawerView mv;
    private Paint mPaint;
    private boolean existingSign;
    private Intent intent;
    private String signature;
    private File imagesDir;

    private ArrayList<MotionEvent> motionEvents = new ArrayList<>();
    private ArrayList<MotionEvent> auxMotionEvents = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawer_act_lay);
        existingSign = getIntent().hasExtra(getPackageName() + "_signaturePath");
        initializeView();
        setListeners();
        Intent iin = getIntent();
        Bundle b = iin.getExtras();
        if (b != null) {
            signature = (String) b.get("signaturePath");
        }

    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onBackPressed() {
        setResult(RESULT_CANCELED);
        finish();
    }

    private void initializeView() {
        drawerBox = this.findViewById(R.id.drawerContainer);
        save = findViewById(R.id.saveBtn);
        clear = findViewById(R.id.clearBtn);
        if (existingSign) {
            mv = new DrawerView(this, BitmapFactory.decodeFile(getIntent()
                    .getStringExtra(getPackageName() + "_signaturePath")));
        } else {
            mv = new DrawerView(this);
        }
        mv.setDrawingCacheEnabled(false);
        mv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
        drawerBox.addView(mv);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(3);
        mv.setDrawingCacheEnabled(true);

    }

//    @Override
//    protected void onRestoreInstanceState(Bundle savedInstanceState) {
//
//        mCurrentPhotoPath = (File) savedInstanceState.getSerializable(MY_CURRENT_PHOTO_PATH_KEY);
//        super.onRestoreInstanceState(savedInstanceState);
//    }
//
//    @Override
//    protected void onSaveInstanceState(Bundle outState) {
//
//        outState.putSerializable(MY_CURRENT_PHOTO_PATH_KEY, mCurrentPhotoPath);
//        super.onSaveInstanceState(outState);
//    }

    private void setListeners() {
        save.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                if (!mv.isSigned()) {
                    Toast.makeText(SignatureActivity.this, R.string.empty_sign, Toast.LENGTH_SHORT).show();
                } else {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
                    String currentDateandTime = sdf.format(new Date());
                    String name = "sign_" + currentDateandTime;
                    Bitmap bitmap = mv.getDrawingCache();
                    File imagesFolder = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
                    imagesFolder.mkdirs();
                    File file = new File(imagesFolder, name + ".jpg");
                    try {
                        if (!file.exists()) {
                            file.createNewFile();
                        }
                        FileOutputStream ostream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
                        ostream.close();
                        mv.invalidate();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        mv.setDrawingCacheEnabled(true);
                    }
                    Intent data = new Intent();
                    data.putExtra(getPackageName() + "_signaturePath", file.getPath());
                    setResult(RESULT_OK, data);

                    finishWithResult(file.getPath());
                    if (signature != null) {
                        File file1 = new File(signature);
                        file1.delete();
                    }
                }
            }
        });
        clear.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mv.clear();
                mv.setIsSigned(false);
            }
        });

    }

    private void finishWithResult(String path) {
        Intent intent = new Intent();
        setResult(RESULT_OK, intent);
        intent.putExtra("path", path);
        finish();
    }


    @Override
    public boolean handleMessage(Message msg) {
        return false;
    }


    public class DrawerView extends View {
        private Bitmap mBitmap;
        private Canvas mCanvas;
        private Path mPath;
        private Paint mBitmapPaint;
        private float mX, mY, sX, sY;
        private boolean isSigned = false;
        private static final String EXTRA_EVENT_LIST = "event_list";
        private static final String EXTRA_STATE = "instance_state";
//        private ArrayList<MotionEvent> eventList = new ArrayList<MotionEvent>(100);

        public DrawerView(Context c) {
            super(c);
            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
            mBitmapPaint.setColor(Color.WHITE);
            setSaveEnabled(true);
        }

        public DrawerView(Context c, Bitmap bitmap) {
            super(c);
            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
            mBitmapPaint.setColor(Color.WHITE);
            mBitmap = bitmap;
            setSaveEnabled(true);
        }


        @Override
        public Parcelable onSaveInstanceState() {



            Bundle bundle = new Bundle();
            bundle.putParcelable(EXTRA_STATE, super.onSaveInstanceState());
            bundle.putParcelableArrayList(EXTRA_EVENT_LIST, motionEvents);

            return bundle;
        }

        @Override
        public void onRestoreInstanceState(Parcelable state) {
            if (state instanceof Bundle) {

                auxMotionEvents = new ArrayList<>();
                motionEvents = new ArrayList<>();

                Bundle bundle = (Bundle) state;
                super.onRestoreInstanceState(bundle.getParcelable(EXTRA_STATE));
                auxMotionEvents = bundle.getParcelableArrayList(EXTRA_EVENT_LIST);
                if (auxMotionEvents == null) {
                    auxMotionEvents = new ArrayList<>();
                }

                return;
            }
            super.onRestoreInstanceState(state);
        }
        public void setIsSigned(boolean isSigned) {
            this.isSigned = isSigned;
        }

        public boolean isSigned() {
            return isSigned;
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
            mCanvas = new Canvas(mBitmap);
            mCanvas.drawColor(Color.WHITE);

            if (motionEvents != null) {
                for (MotionEvent motionEvent : motionEvents) {
                    performTouch(motionEvent);
                }
            }

        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
            canvas.drawPath(mPath, mPaint);
        }

        public void clear() {
            setDrawingCacheEnabled(true);
            mCanvas.drawColor(Color.WHITE);
            invalidate();
        }

        private void drawDot(float x, float y) {
            mCanvas.drawCircle(x, y, 2.0f, mPaint);
        }

        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
            sX = x;
            sY = y;
        }

        private void touch_move(float x, float y) {
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
            mX = x;
            mY = y;
            mCanvas.drawPath(mPath, mPaint);
        }

        private void touch_up() {
            mPath.lineTo(mX, mY);
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
        }


        private void performTouch(MotionEvent event) {
            this.isSigned = true;
            float x = event.getX();
            float y = event.getY();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(x, y);
//                    motionEvents.add(MotionEvent.obtain(event));

                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(x, y);
//                    motionEvents.add(MotionEvent.obtain(event));

                    break;
                case MotionEvent.ACTION_UP:
                    if (x == sX && y == sY) {
                        drawDot(x, y);
                    }
                    touch_up();
//                    motionEvents.add(MotionEvent.obtain(event));

                    break;
            }
            invalidate();
            motionEvents.add(MotionEvent.obtain(event));

//            motionEventsList.add(MotionEvent.obtain(event));
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            motionEvents.add(event);

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_MOVE:
                case MotionEvent.ACTION_UP:
                    performTouch(event);

            }

            return true;
        }

    }
}

When I roatet my phone this function is call : onSizeChanged and when I debug this I see that motionEvents is empty it does not have any object inside , My activity never call this method :onRestoreInstanceState and onSaveInstanceState. I do not have idea what I did wrong.

enter image description here

enter image description here

tompok
  • 27
  • 6

1 Answers1

0

Easy fix. Add the screen orientation like in the below example in you AndroidManifest.xml file :

 <activity
            android:name=".SignatureActivity"
            android:label="@string/title_yourTitle"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar"/>

Its' the android lifecycle being recreated when you rotate the screen, that's why you are facing that problem. By putting it to only portrait, you can't recreate it by rotating the phone.

Elio Lako
  • 1,333
  • 2
  • 16
  • 26