Когда вы должны позволить SurfaceView быть нарисованным UI-потоком? - PullRequest
0 голосов
/ 27 марта 2012

Я читаю о SurfaceView и о том, как его использовать, и я натолкнулся на некоторую информацию о том, что SurfaceView имеет View#willNotDraw(), установленное в значение по умолчанию, и что вам решатьЗвоните SurfaceView#onDraw().Я также читал, что RomainGuy сказал, что это сделано по умолчанию, потому что это более эффективно.Мой вопрос сейчас заключается в том, когда вам следует обрабатывать вызов SurfaceView#onDraw() в отдельном потоке, а когда просто установить View#willNotDraw() на true и просто позвонить SurfaceView#invalidate().Есть ли разница между ними, и один из них улучшает производительность больше, чем другой?

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Использование SurfaceView.onDraw () и SurfaceView.invalidate () приведет к тому, что SurfaceView будет вести себя как обычный вид, и вы будете платить за дополнительные издержки, связанные с SurfaceView. Если вы хотите рисовать из потока пользовательского интерфейса, используйте вместо этого обычный вид. Это проще и дешевле.

1 голос
/ 27 марта 2012

См .:

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

Я не уверен, где вы получили вашу информацию, но, по крайней мере, Javadoc говорит, что большинство пользователей установят это false, чтобы получить Androidчтобы отправить это onDraw события себя.Что касается вашего вопроса о том, когда вы должны сделать это, я бы сказал, что все сводится к тому, почему вы используете SurfaceView.

Если ваш взгляд отображает что-то динамическое (например, для игры или что-то, что имеетжесткий цикл обработки событий), вы захотите контролировать именно то, когда происходят обновления, особенно если у вас есть информация для использования одной из более подробных форм invalidate для сохранения перерисовки всего View.Вам не нужно, чтобы Android вызывал для вас invalidate, и поэтому флаг есть.

Если, с другой стороны, вы просто рисуете что-то статичное, имеет смысл позволить стеку пользовательского интерфейса Androidконтролировать недействительность.

Кстати, invalidate отправляет только запрос на повторное рисование View, так что учтите это, если вы собираетесь использовать стиль цикла событий (onDraw будетбыть вызванным когда-нибудь после вы звоните).

Редактировать: некоторые пояснения.

...