Как создать прокручиваемый и масштабируемый холст в Android?

#android #canvas #bitmap #scroll #zooming

#Android #холст #растровое изображение #прокрутка #масштабирование

Вопрос:

В течение последних недель я искал подходящее решение для масштабирования и прокрутки функций в пользовательском представлении.В моем пользовательском представлении я рисую растровые изображения на своем холсте в onDraw () и создаю новые растровые изображения и холст в onSizeChanged().

мой фрагмент кода здесь :

Метод onDraw().В этом методе я вызываю drawBitmap() этот метод принимает время изображения из класса pagesProvider, который является моим пользовательским классом.

 Bitmap backBitmap = pagesProvider.getPageBitmap(tile);
src = new Rect();
dst = new Rect(); 
@Override
public void onDraw(Canvas canvas) {

        drawBitmap(canvas, b, src, dst);
    }
  

Вот он drawBitmap () этот метод рисует карту на холсте на основе цветового режима. Этот цвет берется из моего класса пользовательских параметров.И снова я рисую растровое изображение на холсте с помощью mBitmap эта mBitmap создана с помощью onSizeChanged () и рисует путь на холсте.

 private void drawBitmap(Canvas canvas, Bitmap backBitmap, Rect src, Rect dst) {

    if (colorMode != Options.COLOR_MODE_NORMAL) {

        paint.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(
                Options.getColorModeMatrix(this.colorMode))));
        canvas.drawBitmap(backBitmap, src, dst, paint);
    } else {
        canvas.drawBitmap(b, src, dst, null);
    }

    canvas.drawBitmap(mTopBitmap, 0, 0, mPaint); // mTopBitmap canvas is creating new bitmap on backBitmap bitmap canvas.
    canvas.drawPath(mPath, mPaint);

}
  

onSizeChanged() :

 @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    this.width = w;
    this.height = h;

    mTopBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mTopBitmap);

}
  

Если я удалю canvas.drawPath(mPath, mPaint); строка из drawBitmap() canvas не рисует пути на холсте mTopBitmap.И если я удалю canvas.drawBitmap(mTopBitmap, 0, 0, mPaint); пути рисуются на backBitmap, но эти пути сбрасываются при прикосновении.

В onTouch UP я вызываю mCanvas.drawPath(mPath, mPaint); для рисования нового пути на mTopBitmap.

И моя проблема заключалась в том, что я хотел прокручивать содержимое холста mTopBitmap независимо от того, что я рисую на mCanvas, и увеличивать содержимое холста mTopBitmap mCanvas.

Я написал функцию масштабирования и добавил скроллер в соответствии с размером backBitmap.Он работает нормально.Но я запутался с холстом mTopBitmap, как я могу поместить прокрутку и масштабирование в холст mTop.

Комментарии:

1. используйте Canvas.concat(матрицу) или комбинацию методов Canvas.translate / Canvas.scale

2. У меня есть библиотека, которая может делать то, что вам нужно, масштабируемое изображение с поддержкой расширения, например, рисования и наложений, которые перемещаются и масштабируются вместе с изображением. Вы, вероятно, не хотите отказываться от того, что у вас есть, но это может быть полезно. Демонстрация: play.google.com/store/apps/… Код: github.com/davemorrissey/subsampling-scale-image-view

3. Привет @pskink Как эти методы полезны при прокрутке. Я думаю, что эти методы полезны при масштабировании.

4. используйте Canvas.translate() для перемещения холста в любом направлении, но Canvas.concat ИМХО лучше, чем комбинация scale / translate