2014-10-18 3 views
1

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

public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

    private float lastFocusX; 
    private float lastFocusY; 

    public ScaleListener() { 
    } 

    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector) { 
     lastFocusX = detector.getFocusX(); 
     lastFocusY = detector.getFocusY(); 
     return true; 
    } 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     Matrix transformatioMatrix = new Matrix(); 
     float focusX = detector.getFocusX(); 
     float focusY = detector.getFocusY(); 

     transformatioMatrix.postTranslate(-focusX, -focusY); 
     transformatioMatrix.postScale(detector.getScaleFactor(), detector.getScaleFactor()); 

     float focusShiftX = focusX - lastFocusX; 
     float focusShiftY = focusY - lastFocusY; 
     transformatioMatrix.postTranslate(focusX + focusShiftX, focusY + focusShiftY); 

     backgroundMatrix.postConcat(transformatioMatrix); 

     lastFocusX = focusX; 
     lastFocusY = focusY; 

     return true; 
    } 
} 

и SimpleOnGestureListener прокрутки и нарисовать изображение

public class ScrollListener extends GestureDetector.SimpleOnGestureListener{ 
    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent event) {   
     float touchX = event.getX(); 
     float touchY = event.getY(); 
     Toast.makeText(context, "onSingleTapUp", Toast.LENGTH_SHORT).show(); 
     playersCanvas.drawBitmap(playerBitmap, touchX, touchY, canvasPaint); 
     invalidate(); 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
     backgroundMatrix.postTranslate(-distanceX, -distanceY); 
     invalidate(); 
     return true; 
    } 
} 

это мой OnDraw:

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawBitmap(background, backgroundMatrix, canvasPaint); 
    canvas.drawBitmap(playersBitmap, backgroundMatrix, canvasPaint); 
} 

Теперь, когда я касаюсь экрана, изображение рисует на холсте, но не там, где я касался, а не в правильном масштабе. Например: Это оригинальный фон: enter image description here

После того масштаба и прокрутки я прикоснулся к экрану в красной окружности местоположении (добавляется после), и изображение было обращено в правом нижнем углу enter image description here

И после того, как сворачивает к исходному размеру вы можете увидеть неправильное расположение на холсте: enter image description here

я нашел this нити, предположит, что у меня есть точка шкалы, которая я не из-за «свободные» с cale и scroll.

Как я могу нарисовать изображение в правильном положении с правильной шкалой?

+0

использование 'Matrix.mapPoints()' – pskink

+0

спасибо !! этот намек приведет меня к ответу. –

+0

приветствуется ... – pskink

ответ

0

Нашел ответ с подсказкой от @pskink. теперь onSingleTapUp выглядит следующим образом:

 @Override 
    public boolean onSingleTapUp(MotionEvent event) {   
     float touchX = event.getX(); 
     float touchY = event.getY(); 

     float[] points = new float[2];   
     points[0] = touchX; 
     points[1] = touchY; 

     Matrix inverse = new Matrix(); 
     backgroundMatrix.invert(inverse); 
     inverse.mapPoints(points); 
     Bitmap scaledPlayer = Bitmap.createBitmap(playerBitmap, 0, 0, playerBitmap.getWidth(), playerBitmap.getHeight(), inverse, true); 
     playersCanvas.drawBitmap(scaledPlayer, points[0], points[1], canvasPaint); 

     invalidate(); 
     return true; 
    } 
+0

вам не нужно создавать масштабированные растровые изображения, но если это сработает для вас ... – pskink

 Смежные вопросы

  • Нет связанных вопросов^_^