#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