Я хочу сохранить растровое изображение при изменении ориентации экрана - PullRequest
0 голосов
/ 02 марта 2019

Я создал пользовательский ImageView с холстом и двумя растровыми изображениями, чтобы я мог рисовать поверх существующего изображения.Хотя ориентация меняется, изображения видны, но линии, которые я нарисовал, исчезают.

public class DrawableImageView extends ImageView implements View.OnTouchListener, DrawableImageViewControlListener {
float downx = 0;
float downy = 0;
float upx = 0;
float upy = 0;

Canvas canvas;
Paint paint;
Matrix matrix;

boolean isChanged;

public DrawableImageView(Context context) {
    super(context);
    setOnTouchListener(this);
}

public DrawableImageView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    setOnTouchListener(this);
}

public DrawableImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setOnTouchListener(this);
}

public void setNewImage(Bitmap alteredBitmap, Bitmap bmp)
{
    canvas = new Canvas(alteredBitmap);
    paint = new Paint();
    paint.setColor(Color.RED);
    paint.setStrokeWidth(5);
    paint.setStrokeCap(Paint.Cap.ROUND);
    matrix = new Matrix();
    canvas.drawBitmap(bmp, matrix, paint);
    isChanged = false;
    setImageBitmap(alteredBitmap);
}


@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    isChanged = true;

    switch (action)
    {
        case MotionEvent.ACTION_DOWN:
            downx = getPointerCoords(event)[0];//event.getX();
            downy = getPointerCoords(event)[1];//event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            upx = getPointerCoords(event)[0];//event.getX();
            upy = getPointerCoords(event)[1];//event.getY();
            canvas.drawLine(downx, downy, upx, upy, paint);
            invalidate();
            downx = upx;
            downy = upy;
            break;
        case MotionEvent.ACTION_UP:
            upx = getPointerCoords(event)[0];//event.getX();
            upy = getPointerCoords(event)[1];//event.getY();
            canvas.drawLine(downx, downy, upx, upy, paint);
            invalidate();
            break;
        case MotionEvent.ACTION_CANCEL:
            break;
        default:
            break;
    }
    return true;
}

final float[] getPointerCoords(MotionEvent e)
{
    final int index = e.getActionIndex();
    final float[] coords = new float[] { e.getX(index), e.getY(index) };
    Matrix matrix = new Matrix();
    getImageMatrix().invert(matrix);
    matrix.postTranslate(getScrollX(), getScrollY());
    matrix.mapPoints(coords);
    return coords;
}

@Override
public void colorChanged(int color) {
    paint.setColor(color);
}

@Override
public void brushChanged(int size) {
    paint.setStrokeWidth(size);
}

public boolean isChanged() {
    return isChanged;
}

А вот код, в котором я инициализирую ImageView в моем OnCreate:

imageView = (DrawableImageView) findViewById(R.id.editImageView);
        IStorage storage = BootLoader.resolve(this).getStorage();
        imageFile = storage.getImageFile(fileName);
        Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
        if (alteredBitmap == null) {
            alteredBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
        }
        imageView.setNewImage(alteredBitmap, bitmap);

Примечание. Я использую два файла макета для двух разных ориентаций и хотел бытак держать.Поэтому не нужно обрабатывать изменения конфигурации вручную.

1 Ответ

0 голосов
/ 02 марта 2019

Android разрушает всю активность при изменении ориентации экрана и перезапускает ее, поэтому вам нужно сохранить измененное растровое изображение, когда это произойдет, и восстановить его впоследствии.

Описаны различные варианты хранения здесь

Когда описано сохранение здесь ,

...