Я использую сторонний ящик, который позволяет выдвижным ящикам нижнего и верхнего края (https://gist.github.com/patrickfav/6284130 MultipleOrientationSlidingDrawer).Как справиться с разрывом дисплея во время анимации ящика
Когда я анимирую открытие ящика, я получаю разрыхление дисплея, но только при определенных обстоятельствах. Когда щелкнул заголовок ящика, анимация гладкая и красивая.
У меня есть RecyclerView в главном окне. Если пользователи нажимают на запись в представлении списка, слайдер выдвигается, показывая детали выбранной записи (нажмите на дорожку, сдвиньте элементы управления мультимедиа снизу). Часть анимации выдвижного ящика заключается в постепенном исчезновении содержимого основного окна до черного цвета. Так что происходит тяжелое переутомление. Как ни странно, когда анимация запускается из щелчка в RecyclerView, я получаю разрывание отображения во время анимации (серьезное мерцание, происходящее примерно на 2/3 пути вниз от верхней части экрана).
Я ищу совет относительно того, как действовать: как отлаживать, или теории относительно того, что может вызвать мерцание дисплея во время анимации.
Вот что я пробовал до сих пор.
Первоначально, хотя это было вызвано анимацией RippleDrawable в записях RecyclerView (как на прессе, так и на изменении активации, которое используется для указания выбора). Чтобы этого избежать, я попытался отменить анимацию пульсаций, вызвав recylerView .jumpDrawablesToCurrentState() в разных точках (начало анимации, а также во время каждого обновления анимации). Насколько я могу судить, анимация RippleDrawable была эффективно отменена, но разворот дисплея все еще происходит. изменение анимации не запускается до тех пор, пока не произойдет какая-либо отправка, но вызов функции startAnimation также не появляется до тех пор, пока не будут завершены законченные изменения состояния. Поэтому я думаю, что я сделал это правильно. На всякий случай, Я попытался вызвать recyclerView.jumpDrawablesToCurrentState во время каждого прохода анимации, который, Добавьте анимацию. Еще нет радости.
У меня есть отложенные ответы на сам клик до тех пор, пока не завершится открытая анимация выдвижного ящика, поэтому в процессе анимации не происходит никаких основных операций фона или переднего плана. Также не работает звук, нет активности в обслуживании. Профилирование указывает, что нет запущенного кода, который не связан с рисунком во время анимации.
Поскольку все происходит относительно быстро, трудно точно сказать, что происходит, кроме того, что происходит серьезное мерцание. Поскольку в анимации задействована анимация, нет возможности прорваться к отладчику в середине анимации, чтобы увидеть, что происходит. Как только я перейду к отладчику, следующая перерисовка будет полностью открыта, так как позиции анимации проистекают из текущего времени uptimeMillis().
Если я проецирую анимацию, я вижу очень много операций по компоновке текста, которые предполагают, что записи просмотра ресайклеров могут постоянно выполнять макет во время анимации. Это не имеет смысла. Нет причин, по которым я могу думать о том, чтобы макет произошел. Возможно, текстовые вызовы связаны с операцией onDraw. Но я упоминаю об этом, потому что то, что я видел в профилировании, кажется немного странным. Большинство времени процессора во время анимации, по-видимому, потрачено на выполнение операций по измерению текста, предположительно для контента в записях RecyclerView.
Происходит тяжелый переулок. Сам ящик имеет большое растровое изображение, содержащее обложку альбомов. И возможно, что у меня могут складываться полупрозрачные слои и фоны. например фон RippleDrawable на отдельных записях в RecyclerView может очень сильно вызвать полный проход overdraw для большей части экрана. Кроме того, есть полный проход для просмотра, который уменьшает фоновое содержимое, когда ящик оживает в открытую позицию.При этом ящик прекрасно анимирует, когда анимация запускается щелчком по заголовку ящика. Просто не когда щелчок, который запускает анимацию, поступает из RecyclerView. Поэтому я не думаю, что переутомление действительно является проблемой.
Для чего стоит разметка дисплея, кажется, не зависит от выбора и нажатия. Нажатие первой или последней записи в RecyclerView не влияет на то, где происходит разметка экрана. ADB shell dumpsys SurfaceFlinger указывает, что аппаратная композиция выполняется на трех уровнях (строка состояния, навигационная панель и основное действие). Таким образом, сам ящик не использует композицию SurfaceFlinger (которая была бы, если бы это происходило, по крайней мере, в общем направлении того, что вызывает разрывы дисплея). Тем не менее, я не могу получить состояние SurfaceFlinger во время анимации. Возможно, во время анимации используется аппаратный состав. Это, конечно, похоже на разворачивание экрана, и я не могу придумать, зачем нужно копировать, если SurfaceFLinger не выполняет композицию.
Я полностью озадачен тем, что может быть проблемой, или подходит, чтобы попытаться отладить это. Любые предложения относительно общего подхода к отладке или предложения относительно того, в чем причина проблемы, могут быть высоко оценены.
Разрыв происходит на самом ящике, в середине растрового изображения обложки альбома (если это имеет значение). Пункт 1. довольно интересен. Любые теории относительно того, почему это изменило бы ситуацию? Должно быть что-то происходит в RecyclerView после события onClick. И, вероятно, есть. Например, обновляемые чертежи встречаются в событии, опубликованном в журнале. Как и ретрансляция, и рисование. Предыдущие и текущие выбранные элементы также были аннулированы, поэтому повторное связывание также произойдет в отправленном событии после нажатия. Избавиться от всего, что не совсем легко. –
Да, я могу, конечно, понять, почему вы так озадачены этой проблемой; это звучит как один из тех странных причуд Android, которые очень сложно отлаживать. К сожалению, я не знаю о каком-либо простом способе отладки странных пользовательских интерфейсов сам ... лично я бы просто попытался максимально упростить макет и изолировать проблему с помощью пробной версии и ошибки ... удалить переустановить, заменить растровое изображение с более общим видом, удалите (казалось бы) незатронутые элементы ящика и т. д. Извините, я не мог больше помочь. – Demonsoul