2012-07-15 4 views
0

У меня есть RoundRectShape, который рисуется в ViewonDraw().Android: RoundRectShape: Изменить угловые радиусы

Углы этой формы изменены любым бугельных действия на этой точке зрения через переопределенном onTouchEvent функции (которая вызывает invalidate() заставить вызов onDraw()).

При инициализации переменных в onDraw, Eclipse показывает предупреждение о том, объект Избегайте распределения во время розыгрыша/операций компоновки (предварительно выделить и повторно использовать вместо этого).

Эта проблема объясняется следующим образом:

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

Как это обычно обрабатывается, чтобы выделить объекты спереди и повторно использовать их для каждого чертежа операции

Чтобы сделать это, я, безусловно, должны быть в состоянии изменить угловые радиусы, как указано в конструкторе , RoundedRectShape class не предоставляет сеттер (и я уверен, что связанные переменные-члены недоступны).

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

Или это просто случай, когда делать лучшее, что нужно заменить, чтобы сделать то, что возможно?

Thanks,

P.S. Вызов конструктора в методе onTouchEvent() удалит предупреждение, но не выполняет абсолютно ничего из-за того, что onDraw() называется каждый раз через invalidate() все равно

ответ

1

Я думаю, что вам не нужно использовать RoundRectShape вообще. RoundRectShape является неизменным, поэтому единственный способ изменить его значения - использовать отражение. Вы можете легко выполнить одни и те же чертежи, вызвав метод Canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint) напрямую, не используя RoundRectShape. Или вы можете посмотреть RoundRectShapeimplementation и просто использовать его код в своем методе onDraw().

EDIT: Комментарии о RoundRectShape не является правильный путь и смотрит на реализацию были правы.После осуществления нашли вызов:

mPath.addRoundedRect() 

который имеет вариацию, позволяющую поплавок угловых радиусов в качестве входа (Path.addRoundRect)

При ответе на вопрос:

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

+0

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