Разница между SurfaceView и View?



когда это необходимо, или лучше использовать SurfaceView вместо View?

757   7  

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, и это очень полезно, если мы хотим сделать высокоскоростную анимацию. У меня есть несколько обучающих видео и пример приложения, которые объясняют все эти вещи красиво. Пожалуйста, взгляните на следующее учебный видеофильм.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

другое определение было бы:

SurfaceView-это специальный вид, который позволяет вам визуализация содержимого непосредственно на экране.

Источник: The Big Nerd Ranch Guide

Comments

    Ничего не найдено.