Как нарисовать наложение на SurfaceView, используемом камерой на Android?

Вы всегда можете изменить изменяемое значение внутри кортежа. Непонятное поведение, которое вы видите с помощью

>>> thing[0] += 'd'

, вызвано +=. Оператор += выполняет добавление на месте, но также присваивает - дополнение на месте работает только с файлом, но присваивание не выполняется, поскольку кортеж является неизменным. Думать об этом, как

>>> thing[0] = thing[0] + 'd'

, объясняет это лучше. Мы можем использовать модуль dis из стандартной библиотеки, чтобы посмотреть на байт-код, сгенерированный из обоих выражений. С += мы получаем байт-код INPLACE_ADD:

>>> def f(some_list):
...     some_list += ["foo"]
... 
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (some_list)
              3 LOAD_CONST               1 ('foo')
              6 BUILD_LIST               1
              9 INPLACE_ADD         
             10 STORE_FAST               0 (some_list)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        

С + получаем a BINARY_ADD:

>>> def g(some_list):
...     some_list = some_list + ["foo"]
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (some_list)
              3 LOAD_CONST               1 ('foo')
              6 BUILD_LIST               1
              9 BINARY_ADD          
             10 STORE_FAST               0 (some_list)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        

Обратите внимание, что мы получаем STORE_FAST в обоих местах. Это байт-код, который терпит неудачу, когда вы пытаетесь сохранить обратно в кортеж - INPLACE_ADD, который появляется перед началом работы.

Это объясняет, почему случай «Не работает и работает» оставляет измененный список позади: кортеж уже имеет ссылку на список:

>>> id(thing[0])
3074072428L

Список затем изменен с помощью INPLACE_ADD и STORE_FAST:

>>> thing[0] += 'd'
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment

Таким образом, кортеж все еще имеет ссылку на тот же список, но список был изменен в -place:

>>> id(thing[0])
3074072428L
>>> thing[0] 
['b', 'c', 'd']

69
задан Cristian 29 May 2010 в 05:05
поделиться

1 ответ

SurfaceView в этом отношении, вероятно, не работает как обычный View .

Вместо этого сделайте следующее:

  1. Поместите SurfaceView внутрь FrameLayout или RelativeLayout в XML-файл макета, поскольку оба они позволяют размещать виджеты на ось Z
  2. Перемещение логики рисования в отдельный пользовательский View класс
  3. Добавить экземпляр пользовательского View в XML-файл макета как дочерний элемент FrameLayout или RelativeLayout , но есть ли он после SurfaceView

. Это приведет к тому, что ваш пользовательский класс View будет отображаться над SurfaceView .

См. Здесь образец проекта , в котором всплывающие панели располагаются над SurfaceView , используемым для воспроизведения видео.

85
ответ дан 24 November 2019 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: