Android: SurfaceView и вопрос Z-уровня

У меня есть FrameLayout, содержащий сначала SurfaceView, а второй RelativeLayout, который, в свою очередь, содержит различные кнопки и TextViews.

На холсте SurfaceView я рисую множество растровых изображений и с помощью событий касания и движения позволяю пользователю перетаскивать их.

Эти растровые изображения при перетаскивании проходят под кнопками и т. д., которые находятся внутри RelativeLayout.

Теперь я (возможно, ошибочно) понимаю, что «Z-уровень» SurfaceView или что-то, что у него есть, что проходит за него, совершенно не связано с фактически Z-уровнем остальной части. Макет. Так ли это? Если да, то как я могу обойти это, чтобы перетаскиваемые растровые изображения рисовались поверх других представлений? Или как еще я могу реализовать полноэкранный холст, но при этом мои кнопки и т. Д. Не действуют как элементы управления наложением.

Я предполагаю, что на самом деле мне нужна подложка, где сенсорные события все еще могут быть обнаружены кнопками и т. д. внизу. Но я не знаю, как этого добиться, так как при перерисовке холста мне приходится перерисовывать и фон.

Могу ли я поменять порядок RelativeLayout и SurfaceView внутри FrameLayout, а затем сделать фон Canvas прозрачным? Если да, то как? Будут ли сенсорные события по-прежнему «проваливаться» на кнопки внизу?

Спасибо, что терпели меня, я знаю, что я немного болтун.


person JimBadger    schedule 12.01.2011    source источник


Ответы (2)


SurfaceView так не работает.

SurfaceView состоит из двух частей: «вид» и «поверхность». Часть «Вид» представляет собой прозрачное отверстие, которое размещается вместе с другими элементами вида и накладывается на слой вида. «Поверхностная» часть — это совершенно отдельный слой, который будет позиционироваться и масштабироваться в соответствии с «видовой» частью и компоноваться системным компоновщиком, а не приложением.

Вы можете управлять Z-порядком «поверхностного» слоя при первом создании SurfaceView, но он будет выше или ниже всех элементов View. Он не может быть выше одних представлений и ниже других, потому что это полностью независимые слои. Слой «поверхность» не улавливает события ввода, поэтому его размещение сверху (через SurfaceView#setZOrderOnTop()) не влияет на фокус ввода.

Для API 14+ вы можете использовать TextureView, который ведет себя более удобно для просмотра.

Изменить: подробные сведения см. в более подробном объяснении.

person fadden    schedule 17.04.2014

Можете ли вы уточнить немного больше? В вашем SurfaceView назначен фон? Если нет, вы, вероятно, могли бы также использовать AbsoluteView, если вы хотите просто перетаскивать части. Если фона нет, вы должны иметь возможность разместить весь вид над RelativeView, который у вас есть, и иметь только различные кнопки и тому подобное, нарисованные на представлении сверху, которые можно было бы перетаскивать и оставаться выше всего остального.

person AkiAki007    schedule 12.01.2011
comment
Привет, спасибо за ответ. Когда растровое изображение перетаскивается, оно оставляет за собой след из перерисовываемых копий самого себя во время события MotionEvent, если для фона холста не установлено, скажем, значение COLOR.Black перед отрисовкой текущего местоположения указанного растрового изображения. Итак, да, у SurfaceView/Canvas есть фон. - person JimBadger; 12.01.2011