Intereting Posts
Ошибка приложения при возобновлении Получить координаты кнопок и определить, находится ли над ними пальцы – Android Имя файла отсутствует для openFileChooser Android 4.4.4 Android Studio зависает при перемещении элемента пользовательского интерфейса Получение «Фрагмент не создавал вид» после присоединения другого фрагмента без пользовательского интерфейса Разрешение конфликтов с Gradle не работает с проектами Android? OSMdroid не смог найти класс GeoPoint Android: обнаружит, когда GPS включен / выключен (или когда приложение больше не использует его) Конфигурация манифеста Android? Установить текст в TextView с помощью Html.fromHtml DDMS – не может связываться с локальным 8600 для отладчика на Android Studio Когда наконец-то привязан к действию фрагмент? Конфигурации отладки / запуска Android Как кривить растровое изображение в android Android-setWidth () кнопки не работает, если ширина ViewGroup равна 'match_parent' / 'fill_parent' в xml?

Анимация в начале действия пропускает кадры

Я onGlobalLayoutFinished вид в активности после того, как onGlobalLayoutFinished вызывается в представлении. Моя анимация пропускает ~ 300 мс кадров в начале. Если я задерживаю анимацию более чем на 300 мс, она не пропускает никаких кадров. Что происходит в деятельности, которая вызывает это? Как я могу остановить его или как его слушать, когда он будет завершен?

Я создал мертвое простое приложение, чтобы продемонстрировать это поведение.

Содержимое <application> в AndroidManifest.xml:

 <activity android:name=".main.TestLagActivity" android:label="Test Lag Activity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

TestLagActivity.java:

 public class TestLagActivity extends ActionBarActivity { private View mRedSquareView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_lag); mRedSquareView = findViewById(R.id.activity_test_lag_redSquareView); if (mRedSquareView.getViewTreeObserver() != null) { mRedSquareView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { mRedSquareView.getViewTreeObserver().removeOnGlobalLayoutListener(this); animate(); } }); } } private void animate() { ObjectAnimator xAnimator = ObjectAnimator.ofFloat(mRedSquareView, "x", 0, 1000); xAnimator.setDuration(1000); xAnimator.start(); } } 

activity_test_lag.xml:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/activity_test_lag_redSquareView" android:layout_width="50dp" android:layout_height="50dp" android:background="#FF0000"/> </FrameLayout> 

В этой демонстрации красный квадрат перемещается слева направо на 1000 пикселей за 1000 миллисекунд. Если задержка не установлена, она пропускает примерно первые 300 пикселей. Если установлена ​​задержка, она плавно анимируется. Смотрите видео ниже.

Без задержки (пропускает кадры): https://www.youtube.com/watch?v=dEwvllhvvN0

400 мс (не пропускает знаменитости): https://www.youtube.com/watch?v=zW0akPhl_9I&feature=youtu.be

Любые комментарии приветствуются.

Это происходит из-за анимации перехода активности, которая воспроизводится во время создания активности. В результате ваша пользовательская анимация начинается, когда система занята рисованием перехода.

Я еще не нашел чистого решения. На данный момент я просто жду времени перехода до начала анимации, но он далеко не идеальный:

 // The duration of the animation was found here: // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.5_r1/frameworks/base/core/res/res/anim/activity_open_enter.xml new Handler().postDelayed(runnable, android.R.integer.config_shortAnimTime); 

Вы также можете отключить переходы активности, используя:

 overridePendingTransition(0, 0); 

Я все еще ищу способ послушать точное время перехода. Будут держать вас в курсе, если я когда-нибудь найду решение.