7 ответов:
все представления рисуются в одном потоке GUI, который также используется для всех пользовательских взаимодействий.
поэтому, если вам нужно быстро обновить графический интерфейс или если рендеринг занимает слишком много времени и влияет на пользовательский опыт, используйте
SurfaceView.
несколько вещей, которые я заметил:
- SurfaceViews содержат хороший механизм рендеринга, который позволяет потокам обновлять содержимое поверхности без использования обработчика (хорошо для анимации).
- Surfaceviews не может быть прозрачными, они могут отображаться только за другими элементами в иерархии представлений.
- я обнаружил, что они гораздо быстрее, чем для анимации рендеринга на вид.
для получения дополнительной информации (и многие пример использования) обратитесь к проекту LunarLander в SDK с примерами раздел.
обновление 05/09/2014
ОК. У нас есть официальные документы. он говорил все, что я упомянул, в лучшем виде.
подробнее здесь.
Да, основное отличие заключается в том, что surfaceView можно обновить в фоновом потоке. Тем не менее, есть больше вы могли бы заботиться.
surfaceView имеет выделенный буфер поверхности, в то время как все представления разделяют один буфер поверхности, выделенный ViewRoot. Другими словами, surfaceView стоит больше ресурсов.
surfaceView не может быть аппаратным ускорением (начиная с JB4. 2), в то время как 95% операций на обычном виде ускоряются с помощью openGL ES.
больше работы должно быть сделано, чтобы создать свой настроенный surfaceView. Вам нужно прослушивать событие surfaceCreated/Destroy, создавать поток рендеринга, что более важно, синхронизировать поток рендеринга и основной поток. Однако, чтобы настроить Смотреть, все, что вам нужно сделать, это переопределить
onDrawметод.- время для обновления отличается. Обычный механизм обновления представления является ограничением или управляется платформой: вы вызываете
view.invalidateв потоке пользовательского интерфейса илиview.postInvalidв другом потоке, чтобы указать фреймворку, что представление должно быть обновлено. Тем не менее, представление не будет обновляться сразу, но ждать до следующего события VSYNC прибыл. Простой подход к пониманию VYSNC заключается в том, чтобы рассматривать его как таймер, который срабатывает каждые 16 мс на экране 60 кадров в секунду. В Android все нормальное обновление вида (и отображение на самом деле, но я не буду говорить об этом сегодня) синхронизируется с VSYNC для достижения лучшей гладкости. Теперь, возвращаясь к surfaceView, вы можете сделать это в любое время, как вы хотите. Однако я вряд ли могу сказать, является ли это преимуществом, поскольку дисплей также синхронизирован с VSNC, как указано ранее.
главное отличие в том, что
SurfaceViewможно рисовать на фоне theads ноViewsНе могу.SurfaceViewsиспользовать больше ресурсов, хотя, так что вы не хотите использовать их, если вы должны.
A
SurfaceViewэто пользовательский вид в Android, который может быть использован для рисования внутри него.
Главное отличие между собойViewиSurfaceViewзаключается в том, что целью обращается вUI Thread, который используется для взаимодействия с пользователем.
если вы хотите обновить пользовательский интерфейс достаточно быстро и сделать хороший объем информации в это, SurfaceView является лучшим выбором.но есть несколько технических внутренности к
SurfaceView:1. они не аппаратное ускорение.
2. нормальные представления отображаются при вызове методаinvalidateилиpostInvalidate(), но это не значит, что вид будет сразу же обновил (аVSYNCбудет отправлено, и ОС решает, когда он обновляется. ЭлементSurfaceViewможет быть немедленно обновлены.
3. SurfaceView имеет выделенныйsurface buffer, так что более дорогостоящим
одно из основных различий между surfaceview и view заключается в том, что для обновления экрана для нормального представления мы должны вызвать метод invalidate из того же потока, где определено представление. Но даже если мы называем недействительным, обновление происходит не сразу. Это происходит только после следующего поступления сигнала VSYNC. Сигнал VSYNC-это сигнал, генерируемый ядром, который происходит каждые 16,6 МС или это также известно как 60 кадров в секунду. Так что если мы хотим больше контроля над обновлением на экране (например, для очень быстрой анимации) мы не должны использовать обычный класс просмотра.
с другой стороны, в случае surfaceview, мы можем обновить экран так быстро, как мы хотим, и мы можем сделать это из фонового потока. Таким образом, обновление surfaceview действительно не зависит от VSYNC, и это очень полезно, если мы хотим сделать высокоскоростную анимацию. У меня есть несколько обучающих видео и пример приложения, которые объясняют все эти вещи красиво. Пожалуйста, взгляните на следующее учебный видеофильм.
другое определение было бы:
SurfaceView-это специальный вид, который позволяет вам визуализация содержимого непосредственно на экране.
Источник: The Big Nerd Ranch Guide
Comments