Увеличить отображение неправильной позиции растрового изображения в Android
Может быть, этот вопрос дублирует, но я искал много вещей, связанных с этим, но не могу найти решение. Я пытаюсь увеличить круг над пользователем, который касается растрового изображения, я получаю координаты x и y из onTouchListner, все в порядке, но мое увеличение отображает неправильную позицию,
Как я могу решить эту проблему
Вот мой код
public class ImageSurfaceMagnify extends SurfaceView implements SurfaceHolder.Callback {
private Bitmap icon;
private Paint paint, shaderPaint;
/**
* Magnify
*/
private BitmapShader shader;
PointF zoomPos = new PointF(0,0);
Matrix matrix;
private boolean zooming = false;
public ImageSurfaceMagnify(Context context, File image, Bitmap resource) {
super(context);
getHolder().addCallback(this);
setWillNotDraw(false);
icon = resource;
paint = new Paint();
/**
* Magnify
*/
shader = new BitmapShader(icon, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
matrix = new Matrix();
shaderPaint = new Paint();
shaderPaint.setShader(shader);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(icon != null && !zooming) {
int newWidth = canvas.getHeight() * icon.getWidth() / icon.getHeight();
icon = Bitmap.createScaledBitmap(icon, newWidth, canvas.getHeight(), false);
canvas.drawColor(Color.BLACK);
int cx = (canvas.getWidth() - icon.getWidth()) / 2;
int cy = (canvas.getHeight() - icon.getHeight()) / 2;
Log.e("New", "Width " + newWidth + " Hight " + canvas.getHeight()+" cx "+cx+" cy "+cy);
canvas.drawBitmap(icon, cx, cy, paint);
}else{
matrix.reset();
matrix.postScale(1.5f, 1.5f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);
//matrix.postScale(2f, 2f, -zoomPos.x, -zoomPos.y);
shader.setLocalMatrix(matrix);
canvas.drawCircle(zoomPos.x+100, zoomPos.y+100, 100, shaderPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
zoomPos.x = event.getX();
zoomPos.y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
zooming = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
zooming = false;
this.invalidate();
break;
default:
break;
}
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@SuppressLint("WrongCall")
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas(null);
synchronized (holder) {
onDraw(canvas);
}
} catch (Exception e) {
e.printStackTrace();
if (canvas != null)
onDraw(canvas);
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
Результат x и y точен, если я рисую круг, но Magnify - это другая позиция, почему?