DrawerView очищается, когда я поворачиваю телефон

Если вы используете Spring, отметьте класс как @Transactional , тогда Spring будет обрабатывать управление сеансом.

@Transactional
public class My Class {
    ...
}

Используя @Transactional, многие важные аспекты, такие как транзакция распространение происходит автоматически. В этом случае, если вызывается другой метод транзакции, метод будет иметь возможность присоединиться к текущей транзакции, избегая исключения «no session».

0
задан tompok 16 January 2019 в 13:09
поделиться

1 ответ

Вы можете сохранить сенсорные события в каком-либо списке, а затем воссоздать их после изменений конфигурации. Это уже объяснено здесь.

Ваш класс должен выглядеть следующим образом

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_STATE = "exta_state";
private static final String EXTRA_EVENT_LIST = "exta_event_list";


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

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, AttributeSet attributeSet) {
    super(c, attributeSet);
    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);
}

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);
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            break;
        case MotionEvent.ACTION_UP:
            if (x == sX && y == sY) {
                drawDot(x, y);
            }
            touch_up();
            break;
    }
    invalidate();
    motionEvents.add(MotionEvent.obtain(event));
}




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 (auxMotionEvents != null) {
        for (MotionEvent motionEvent : auxMotionEvents) {
            performTouch(motionEvent);
        }
    }

}


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

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

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

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, mBitmapPaint);
}

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

@Override
public boolean onTouchEvent(MotionEvent event) {

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

    return true;
}

}

Не забудьте удалить android: configChanges = "клавиатураHidden | Ориентация | screenSize" из вашего manisfest и дать представление представление идентификатор так это может быть воссоздано.

Чтобы установить идентификатор для вашего представления, используйте setId () после создания экземпляра DrawerView в вашем initializeView (). Это должно выглядеть примерно так

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.setId(View.generateViewId());

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);

}

0
ответ дан npeixoto 16 January 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: