2015-12-18 2 views
1

Я использую сторонний ящик, который позволяет выдвижным ящикам нижнего и верхнего края (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 не выполняет композицию.

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

ответ

0

На каком слое описывается разрывание? Это на самом ящике или на макете за ящиком?

В любом случае, у меня есть несколько предложений:

  1. овердрафта может быть Glitchy в разы, особенно со сложными макетами - я столкнулся с проблемами с ней конкретно на GoogleMaps фрагментах. Что-то, что решить это в моем случае было создание простого прозрачного наложения забрасывать овердрафт на, например, так:

    <FrameLayout for drawer....> 
    
    <View 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/transparent" /> 
    
    <LinearLayout w/ fragments etc..../> 
    
    </FrameLayout> 
    
  2. выдвижных Анимации, как известно, плохо по их прямому назначению ... они будут отставать, как сумасшедший во время переходов макета , Я знаю, что вы сказали, что убедитесь, что анимация ящика закончена, прежде чем что-либо делать, но это то, что стоит дважды проверить. По этой причине я лично поместил весь свой навигационный код в метод OnDrawerClosed() и использовал код itemSelected(), чтобы установить флаг и закрыть ящик.

+0

Разрыв происходит на самом ящике, в середине растрового изображения обложки альбома (если это имеет значение). Пункт 1. довольно интересен. Любые теории относительно того, почему это изменило бы ситуацию? Должно быть что-то происходит в RecyclerView после события onClick. И, вероятно, есть. Например, обновляемые чертежи встречаются в событии, опубликованном в журнале. Как и ретрансляция, и рисование. Предыдущие и текущие выбранные элементы также были аннулированы, поэтому повторное связывание также произойдет в отправленном событии после нажатия. Избавиться от всего, что не совсем легко. –

+0

Да, я могу, конечно, понять, почему вы так озадачены этой проблемой; это звучит как один из тех странных причуд Android, которые очень сложно отлаживать. К сожалению, я не знаю о каком-либо простом способе отладки странных пользовательских интерфейсов сам ... лично я бы просто попытался максимально упростить макет и изолировать проблему с помощью пробной версии и ошибки ... удалить переустановить, заменить растровое изображение с более общим видом, удалите (казалось бы) незатронутые элементы ящика и т. д. Извините, я не мог больше помочь. – Demonsoul