Это потому, что onTouch - не единственный способ взаимодействия с Views.
Для CollapsingToolbarLayout
вам сначала нужно понять, что он предназначен для использования в качестве потомка AppBarLayout
.
AppBarLayout
- это в значительной степени вертикаль LinearLayout
, которая используется для реализации множества функций, относящихся к Material Design, включая функции прокрутки. Другими словами, этот макет - это то, что обрабатывает прокрутку для дочернего представления.
В источнике CollapsingToolbarLayout
, посмотрите на метод onAttachedToWindow()
. Внутри этого метода вы увидите, что если родителем этой панели инструментов является AppBarLayout
, то он установит пользовательский OffsetUpdateListener
в метод своего родителя addOnOffsetChangedListener()
. Посмотрите дальше вниз по источнику, чтобы увидеть определение его OffsetUpdateListener
.
Это значит, что CollapsingToolbarLayout
говорит своему родителю (AppBarLayout)
сказать себе, есть ли какие-либо изменения в «смещении», которым является прокрутка.
Так что нет необходимости для CollapsingToolbarLayout
иметь переопределение 'OnTouch', потому что оно не обрабатывает касания или прокрутку. Он просто позволяет своему родителю обрабатывать прокрутку, в то время как он просто сообщает родителю, чтобы он знал, когда он должен реагировать, другими словами ... когда он должен свернуться или развернуться.
VC ++ компилятор (cl.exe) поддерживает несколько переключателей командной строки для этого:
/E preprocess to stdout
/P preprocess to file
/EP preproscess to stdout with no #lines
Дополнительные переключатели командной строки могут быть добавлены в Ваших свойствах проекта. В моей версии (VC2005), Параметрах конфигурации-> C/C++-> Командная строка-> Дополнительные опции
Компилятор на самом деле не делает ни одного макрорасширения. Это - задача препроцессора. Все это появляется как один шаг, но компилятор на самом деле отваливает к отдельному препроцессору задачи и захватывает вывод для Вас.
Шаблоны не "расширены" во время компиляции. Они инстанцируют на использовании во время компиляции. Различие - то, что компилятор сразу генерирует объектный код для шаблона; нет никакого промежуточного исходного кода, который выходит. Вы не можете посмотреть на инстанцированный код шаблона как на источник, он разгружен как блок, когда он необходим.
Если у Вас есть GCC, можно также звонить, препроцессор непосредственно с помощью 'cpp' с правильными аргументами (главным образом включают пути и макроопределения командной строки). Другие ответили за MSVC.
Обратите внимание, что/E в VC ++ только разворачивает операторы препроцессора (то есть, #include, #ifdef, #define и т.д.)
Я не знаю ни о каком современном компиляторе, который позволяет разворачивать шаблоны.
Для испускания предварительно обработанного кода назовите cpp непосредственно использования-E опцией в gcc и связанных компиляторах; я уверен, другие компиляторы или пакеты имеют подобные вещи (действительно согласно другому ответу, это-/E или/P в VC ++).
Не уверенный в выводе инстанцированных шаблонов. Это намного более трудно сделать, я думаю, так как это - на самом деле часть компиляции вместо того, чтобы предварительно обработать (по крайней мере, в современных компиляторах, начиная с исходной cfront версии, которая была c ++-to-c переводчик, если я вспоминаю правильно).
Легко добавить опцию к компиляторам для проявления вывода после макроподстановки. Это определяется как простая текстовая опция замены так или иначе. Много компиляторов реализуют это как отдельный этап, иногда даже обработанный как отдельный инструмент. В любом случае результатом макроподстановки является набор Единиц перевода в текстовой форме.
Шаблоны, с другой стороны, компилируются. Существует несколько этапов к этому. Имена разрешены дважды, например. На любом этапе компилятор сохранил бы результат поиска имени. Это - запись в таблице. Как Вы показали бы это в текстовой форме? Нет никакого тривиального выражения C++ для этого.