Правильный способ масштабирования (масштабирования) части фонового растрового изображения на холсте Surfaceview внутри цикла рисования - PullRequest
0 голосов
/ 01 сентября 2018

Я работаю над этим, как сумасшедший, больше часов, чем хочу признаться, и несколько раз отказывался от своих попыток. Это самая разумная версия того, что у меня есть, но у нее есть две проблемы:

1.) Он масштабируется только в верхнем левом углу изображения, и больше нигде. Я бы хотел, чтобы пользователь мог масштабировать, где ему угодно.

2.) Я бы хотел иметь возможность панорамировать изображение для пользователя, но я заблокирован краем экрана. Не уверен, как я мог продолжать эту вещь так сказать.

Я посмотрел на android.graphics.camera и поиграл с матрицей класса android, но не смог заставить себя что-то делать. Я думаю, что, возможно, часть цикла отрисовки немного сбивает мое чувство логики, поскольку я обычно не работаю с ними.

Метод, вызываемый внутри цикла рисования:

public void drawFrame(Canvas canvas) {
    //super.onDraw(canvas);
    int newWidth=0;
    int newHeight=0;
    float scale = gestures.getScaleFactor();
    if(this.mBackgroundBitmap!=null) {
        canvas.save();
        float screenScaleX = (float) (this.mBackgroundBitmap.getWidth() / (float) getWidth()) * scale;
        float screenScaleY = (float) (this.mBackgroundBitmap.getHeight() / (float) getHeight()) * scale;

        canvas.translate(gestures.getScaleFocusX()/2, gestures.getScaleFocusY()/2);

        newWidth = Math.round(this.mBackgroundBitmap.getWidth() / screenScaleX);
        newHeight = Math.round(this.mBackgroundBitmap.getHeight() / screenScaleY);
        scaledBitmap = Bitmap.createScaledBitmap(this.mBackgroundBitmap, newWidth, newHeight, true);
        canvas.drawBitmap(scaledBitmap,0,0, new Paint());
        canvas.restore();

    }

Класс жестов, который я использую с моим пользовательским видом поверхности:

public class MaelstromGestures implements View.OnTouchListener, ScaleGestureDetector.OnScaleGestureListener, View.OnLongClickListener {
private View view;
private ScaleGestureDetector gestureScale;
public MapActivity mapActivity;

public float getScaleFactor() {
    return scaleFactor;
}

public void setScaleFactor(float scaleFactor) {
    this.scaleFactor = scaleFactor;
}

private float scaleFactor = 1;

public boolean isInScale() {
    return inScale;
}

boolean inScale=false;

private float scaleFocusX = 0;
private float scaleFocusY = 0;

public float getScaleFocusX(){
    return gestureScale.getFocusX();
}
public float getScaleFocusY(){
    return gestureScale.getFocusY();
}



public MaelstromGestures (Context c){ gestureScale = new ScaleGestureDetector(c, this); }

@Override
public boolean onTouch(View view, MotionEvent event) {
    this.view = view;
    gestureScale.onTouchEvent(event);
    mapActivity.doTouch(view,event);

    return true;
}



@Override
public boolean onScale(ScaleGestureDetector detector) {
    scaleFactor *= detector.getScaleFactor();
    //scaleFactor = (scaleFactor < 0.5f ? 0.5f : scaleFactor); // prevent our view from becoming too small //
    scaleFactor = Math.max(1.0f, Math.min(scaleFactor, 3.0f));//((float)((int)(scaleFactor * 25))) / 25; // Change precision to help with jitter when user just rests their fingers //

    //view.setScaleX(scaleFactor);
    //view.setScaleY(scaleFactor);
    return true;
}

@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
    inScale = true;
    scaleFocusX = gestureScale.getFocusX();
    scaleFocusY = gestureScale.getFocusY();
    return true;
}

@Override
public void onScaleEnd(ScaleGestureDetector detector) { inScale = false; }

}

...