Как работает SurfaceView
Что проверяют
Понимаете ли вы, чем SurfaceView отличается от обычного View на уровне сборки кадра, и умеете ли безопасно рисовать из своего потока. Следом спрашивают про разницу с TextureView и про то, что делать в surfaceDestroyed.
Как отвечать
Обычные View рисуются в общий буфер окна на главном потоке. SurfaceView получает собственный Surface, отдельный слой, который компоновщик SurfaceFlinger кладёт под окно приложения или поверх него. Сам View в иерархии лишь вырезает под этот слой «окошко». Поэтому в свой буфер можно рисовать с любого потока, не блокируя UI. Важно: поток SurfaceView не создаёт, его запускаете вы.
Работа идёт через SurfaceHolder:
SurfaceHolder.Callback:surfaceCreated(можно начинать рендер),surfaceChanged(новый размер или формат),surfaceDestroyed(поверхность уходит, например при сворачивании);- рисование на Canvas:
lockCanvas()отдаёт холст (илиnull), после отрисовки вызываетсяunlockCanvasAndPost(). Этот холст программный, аппаратный даётlockHardwareCanvas(); - другие источники кадров: OpenGL ES через
GLSurfaceViewс его GL-потоком иRenderer, Vulkan, декодерMediaCodec, камера, плеер Media3.
Главное правило: после возврата из surfaceDestroyed поверхность трогать нельзя. Поэтому в колбэке выставляют флаг остановки, ждут поток через join() и только потом возвращают управление.
Сравнение с TextureView: тот рисует в текстуру внутри иерархии, поэтому поддерживает alpha, масштаб и анимации как обычный View, но платит лишним копированием кадра, задержкой и расходом батареи. Для видео и камеры обычно выбирают SurfaceView. В Compose его встраивают через AndroidView или AndroidExternalSurface.
Где спотыкаются
Говорят, что SurfaceView сам рисует в фоне. Без вашего потока или GL-рендерера ничего не происходит.
Не останавливают поток до выхода из surfaceDestroyed. Итог: падение на уничтоженной поверхности или зависание, если join() ждёт поток, которому не сообщили об остановке.
Утверждают, что SurfaceView не получает касания. Это обычный View, onTouchEvent у него работает, сложности бывают лишь с наложением и прозрачностью.