Закусочная и другие анимации перестали работать на некоторых устройствах Android

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

Проблема заключается в анимации. В частности, это снэк-бар. Закусочная должна анимировать вверх и вниз, но это не так. Он просто показывает, затем прячется. Просмотрите видео ниже, чтобы увидеть проблему.

Видео выпуска

Вот код Android, чтобы оживить закусочную в

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { ViewCompat.setTranslationY(mView, mView.getHeight()); ViewCompat.animate(mView) .translationY(0f) .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) .setDuration(ANIMATION_DURATION) .setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationStart(View view) { mView.animateChildrenIn(ANIMATION_DURATION - ANIMATION_FADE_DURATION, ANIMATION_FADE_DURATION); } @Override public void onAnimationEnd(View view) { onViewShown(); } }).start(); } 

Его использование ViewCompat для библиотеки v4. У меня есть другие анимации, работающие в другой деятельности, прекрасно работающей. Кроме того, проблема заключается не только в одном мероприятии, но и в каждом из них. Это заставляет меня думать о своей системе как-то. Но все они используют разные внутренние темы, но все расширяют Theme.AppCompat.NoActionBar.

Вот мой основной макет

 <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:elevation="4dp"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:titleTextAppearance="@style/ToolbarTitle" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways|snap"/> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabTextAppearance="@style/TabText" app:tabMinWidth="@dimen/tab_minwidth" app:tabMode="fixed" app:tabGravity="fill" app:layout_scrollFlags="enterAlways"/> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> <fr.castorflex.android.circularprogressbar.CircularProgressBar android:id="@+id/base_progressSpinner" android:layout_gravity="center" android:layout_width="48dp" android:layout_height="48dp" android:indeterminate="true" android:visibility="invisible" app:cpb_color="@color/spinner" app:cpb_rotation_speed="1.0" app:cpb_sweep_speed="1.0" app:cpb_stroke_width="4dp" app:cpb_min_sweep_angle="10" app:cpb_max_sweep_angle="300"/> <android.support.design.widget.FloatingActionButton android:id="@+id/fab_upload" android:visibility="gone" android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_anchor="@id/content_frame" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" android:src="@drawable/app_fab_upload" android:layout_margin="@dimen/big_padding" android:clickable="true" app:backgroundTint="@color/fab_social"/> <android.support.design.widget.FloatingActionButton android:id="@+id/fab_muzei" android:visibility="gone" android:layout_height="wrap_content" android:layout_width="wrap_content" app:layout_anchor="@id/content_frame" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" android:src="@drawable/app_fab_muzei" android:layout_margin="@dimen/big_padding" android:clickable="true" app:backgroundTint="@color/fab_social"/> </android.support.design.widget.CoordinatorLayout> 

Устройства, на которых он работает

  • Nexus 9 (Marshmallow)
  • Nexus 4 (KitKat)
  • Галактика S7 (Зефир)

Устройства не работают

  • Droid Turbo 2 (Зефир)
  • Galaxy S7 (Marshmallow) * мое устройство работает, мои тестеры не
  • Nexus 6p (Android N)

Другие проблемы с анимацией – с коммутаторами. У меня 2 в одном макете и один заикается при переключении, а другой просто переключается без анимации.

У меня также есть LayoutTransition, установленный для моего AppBarLayout для анимации скрытия / показа моего TabLayout, и он отлично работает, и все устройства

Я нашел причину, по которой это происходит, но не как исправить.

 /** * Returns true if we should animate the Snackbar view in/out. */ private boolean shouldAnimate() { return !mAccessibilityManager.isEnabled(); } 

Это вызвано классом Snackbar и является ложным на рабочих устройствах, а true – на неработающих устройствах. Кто-нибудь знает об этом?

Поэтому после того, как я отключил lastpass в своих системных настройках, доступность snackbar теперь оживляет, как и должно быть. Это безумие, как это работает. Нова-пусковая установка оказывает такое же влияние. Я предполагаю, что любая служба доступности, которая включена, приведет к тому, что анимация snackbar не будет работать.

Как отметил Биньядад, проблема заключается в том, что любая функция доступности, включая такие вещи, как пароли, отключает анимацию закуски. Google, на момент написания этой статьи, по-прежнему отказывается ее исправлять

Как я вижу, поскольку базовый класс Snackbar BaseTransientBottomBar обрабатывает анимацию, с закрытыми частными пакетами, у вас есть два варианта, если вы хотите исправить это: сверните свою собственную закусочную с нуля или используйте более хакерское решение с отражением:

Пример Котлина:

 Snackbar.make(coordinatorLayout, text, duration).apply { try { val mAccessibilityManagerField = BaseTransientBottomBar::class.java.getDeclaredField("mAccessibilityManager") mAccessibilityManagerField.isAccessible = true val accessibilityManager = mAccessibilityManagerField.get(this) val mIsEnabledField = AccessibilityManager::class.java.getDeclaredField("mIsEnabled") mIsEnabledField.isAccessible = true mIsEnabledField.setBoolean(accessibilityManager, false) mAccessibilityManagerField.set(this, accessibilityManager) } catch (e: Exception) { Log.d("Snackbar", "Reflection error: $e") } } 

Пример Java:

 Snackbar snackbar = Snackbar.make(coordinatorLayout, text, duration); try { Field mAccessibilityManagerField = BaseTransientBottomBar.class.getDeclaredField("mAccessibilityManager"); mAccessibilityManagerField.setAccessible(true); AccessibilityManager accessibilityManager = (AccessibilityManager) mAccessibilityManagerField.get(snackbar); Field mIsEnabledField = AccessibilityManager.class.getDeclaredField("mIsEnabled"); mIsEnabledField.setAccessible(true); mIsEnabledField.setBoolean(accessibilityManager, false); mAccessibilityManagerField.set(snackbar, accessibilityManager); } catch (Exception e) { Log.d("Snackbar", "Reflection error: " + e.toString()); } return snackbar; 

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