Я предлагаю использовать непрерывную проверку вероятности и остальной части случайного числа.
Эта функция сначала устанавливает возвращаемое значение в последний возможный индекс и выполняет итерацию до тех пор, пока остальная часть случайного значения не будет равна меньше реальной вероятности.
Вероятности должны суммироваться с одним.
function getRandomIndexByProbability(probabilities) {
var r = Math.random(),
index = probabilities.length - 1;
probabilities.some(function (probability, i) {
if (r < probability) {
index = i;
return true;
}
r -= probability;
});
return index;
}
var i,
probabilities = [0.8, 0.1, 0.1],
count = probabilities.map(function () { return 0; });
for (i = 0; i < 1e6; i++) {
count[getRandomIndexByProbability(probabilities)]++;
}
console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }
В основном, CollapsingToolbarLayout
не является View
, но ViewGroup
. Он наследует от FrameLayout
и выступает в качестве контейнера для AppBarLayout
, когда некоторые из представлений необходимо было свернуть / развернуть на основе поведения прокрутки панели приложения .
Итак, это оболочка для Toolbar
, которая реализует сворачивающуюся панель приложения. Он предназначен для использования в качестве прямого потомка AppBarLayout
.
Теперь к вашему вопросу:
" Так как CollapsingToolbarLayout
можно свернуть / развернуть с помощью нашего пальца, но нет метода onTouch
переопределить? "
Ответ прост, это не так. Это сам AppBarLayout
, который перехватывает событие касания на основе слушателя OffsetChange и передает обратные вызовы его потомкам. У CollapsingToolbarLayout
есть возможность анимировать заголовок панели инструментов (свернуть / развернуть) и некоторые другие вещи, такие как фоновое изображение, закрепление заголовка и т. Д., Поэтому, в основном, он реагирует на прослушиватель OffsetChange [1123] при получении обратных вызовов. 1117]
Проверьте официальную ссылку для более подробной информации.
Это потому, что onTouch - не единственный способ взаимодействия с Views.
Для CollapsingToolbarLayout
вам сначала нужно понять, что он предназначен для использования в качестве потомка AppBarLayout
.
AppBarLayout
- это в значительной степени вертикаль LinearLayout
, которая используется для реализации множества функций, относящихся к Material Design, включая функции прокрутки. Другими словами, этот макет - это то, что обрабатывает прокрутку для дочернего представления.
В источнике CollapsingToolbarLayout
, посмотрите на метод onAttachedToWindow()
. Внутри этого метода вы увидите, что если родителем этой панели инструментов является AppBarLayout
, то он установит пользовательский OffsetUpdateListener
в метод своего родителя addOnOffsetChangedListener()
. Посмотрите дальше вниз по источнику, чтобы увидеть определение его OffsetUpdateListener
.
Это значит, что CollapsingToolbarLayout
говорит своему родителю (AppBarLayout)
сказать себе, есть ли какие-либо изменения в «смещении», которым является прокрутка.
Так что нет необходимости для CollapsingToolbarLayout
иметь переопределение 'OnTouch', потому что оно не обрабатывает касания или прокрутку. Он просто позволяет своему родителю обрабатывать прокрутку, в то время как он просто сообщает родителю, чтобы он знал, когда он должен реагировать, другими словами ... когда он должен свернуться или развернуться.
они используют OnOffsetChangedListener, который является определением интерфейса для обратного вызова, который вызывается при изменении вертикального смещения AppBarLayout.
onOffsetChanged Вызывается, когда смещение макета AppBarLayout было изменено. Это позволяет дочерним представлениям реализовывать пользовательское поведение на основе смещения (например, закрепление представления с определенным значением y).
здесь ссылка OnOffsetChangedListener