habrahabr.ru/post/151492 Здесь я в свое время описал работу с канвасом на джаве.
//унаследовались от ScaleGestureDetector.SimpleOnScaleGestureListener, чтобы не писать пустую реализацию ненужных
//методов интерфейса OnScaleGestureListener
private class MyScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
//обрабатываем "щипок" пальцами
@Override
public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
float scaleFactor=scaleGestureDetector.getScaleFactor();//получаем значение зума относительно предыдущего состояния
//получаем координаты фокальной точки - точки между пальцами
float focusX=scaleGestureDetector.getFocusX();
float focusY=scaleGestureDetector.getFocusY();
//следим чтобы канвас не уменьшили меньше исходного размера и не допускаем увеличения больше чем в 2 раза
if(mScaleFactor*scaleFactor>1 && mScaleFactor*scaleFactor<2){
mScaleFactor *= scaleGestureDetector.getScaleFactor();
canvasSize =viewSize*mScaleFactor;//изменяем хранимое в памяти значение размера канваса
//используется при расчетах
//по умолчанию после зума канвас отскролит в левый верхний угол.
//Скролим канвас так, чтобы на экране оставалась
//область канваса, над которой был жест зума
//Для получения данной формулы достаточно школьных знаний математики (декартовы координаты).
int scrollX=(int)((getScrollX()+focusX)*scaleFactor-focusX);
scrollX=Math.min( Math.max(scrollX, 0), (int) canvasSize -viewSize);
int scrollY=(int)((getScrollY()+focusY)*scaleFactor-focusY);
scrollY=Math.min( Math.max(scrollY, 0), (int) canvasSize -viewSize);
scrollTo(scrollX, scrollY);
}
//вызываем перерисовку принудительно
invalidate();
return true;
}
}