Использование холста намного больше экрана - PullRequest
2 голосов
/ 11 февраля 2011

Я пытаюсь нарисовать 2D контурный график некоторых данных на Android, и мне интересно, как лучше всего нарисовать их.Все наборы данных могут быть относительно большими (2k * 2k точек), а масштабирование и перемещение внутри графика должны быть очень быстрыми.В большинстве случаев будет отображаться только небольшая часть данных, поскольку пользователь увеличил масштаб данных.

Моя идея теперь состоит в том, чтобы нарисовать весь график на большом холсте, но обрезать его до той части, которая видна на экране, чтобы в конце была действительно нарисована только эта часть.Я нахожу API-интерфейс 2D-рисования в Android несколько запутанным, и я не уверен, является ли это действительно выполнимым подходом, и как мне тогда его выполнить.

Итак, мои вопросы:

  • Является ли хорошей идеей нарисовать на холсте намного больше экрана и использовать обрезку для отображения только соответствующей части?
  • Как создать холст большего размера и выбрать, какие части рисовать?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Вы должны начать наоборот.Вместо того, чтобы создавать огромный холст, вы должны определить, какую часть своего графика вам нужно нарисовать, и нарисовать только это.

Так что в основном вам нужна некоторая навигация / прокрутка и вы должны сохранить смещение от начальной точки в памятирассчитать, где вы находитесь.Используя смещение, вы можете легко увеличивать и уменьшать масштаб, потому что вам просто нужно масштабировать график на экране.

1 голос
/ 12 февраля 2011

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

Правильный способ - сделать все это математически и рассчитать, какая часть графика должна быть нарисованаТребуемая позиция и масштаб.Используя рисование anti_alias для линий и текста, график всегда получался бы четким и хорошим ... Когда пользователь уменьшает масштаб, некоторые элементы не должны отображаться, поскольку они не могут поместиться на экране или загромождают его.Таким образом, график всегда будет оптимизирован для уровня масштабирования ...

1 голос
/ 11 февраля 2011

Это хорошая идея, чтобы нарисовать на холст намного больше экрана и используйте отсечение, чтобы отобразить только соответствующая часть?

Лучший вопрос может быть, у вас есть другие варианты. Некоторые могут возразить, что это плохая идея, поскольку вы собираетесь поддерживать память в рабочем состоянии, когда это не имеет отношения к тому, что происходит в пользовательском интерфейсе. Однако, исходя из моего опыта работы с Canvas, я думаю, вы обнаружите, что это должно сработать очень хорошо. Теперь, если вы пытаетесь сохранить «5 квадратных миль» холста в памяти, вам определенно придется искать лучший способ управлять им.

Как бы я создал больший холст и как бы я выбрал, какие части должны быть нарисованным?

Я ожидаю, что вы создадите свой собственный метод "прокрутки", когда пользователь коснется экрана, переопределив метод onTouchEvent. По сути, вам нужно отслеживать начальную точку X и Y и просто отслеживать это значение при перемещении Canvas на экране. Для перемещения Canvas имеется ряд встроенных функций, таких как translate и scale, которые можно использовать для перемещения Canvas по X и Y, а также для масштабирования, когда пользователь увеличивает или уменьшает .

...