Я работаю над этим, как сумасшедший, больше часов, чем хочу признаться, и несколько раз отказывался от своих попыток. Это самая разумная версия того, что у меня есть, но у нее есть две проблемы:
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; }
}