Ответы пользователя по тегу Canvas
  • Android: странное поведение Canvas?

    @xotta6bl4
    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;
            }
        }
    Ответ написан