6

onGlobalLayoutFinished görüntülendikten sonra bir etkinlikte bir görünümü canlandırıyorum. Animasyonum başlangıçta ~ 300 ms değerinde kareleri atlıyor. Animasyonu ~ 300 ms'den fazla geciktirirsem, herhangi bir kareyi atlamaz. Bunun gerçekleşmesine neden olan etkinlikte neler oluyor? Nasıl durdurabilirim veya bittiğinde nasıl dinleyebilirim?Etkinliğin başlangıcındaki animasyon kareleri atlar

Bu davranışı göstermek için son derece basit bir uygulama geliştirdim. AndroidManifest.xml <application> arasında

içeriği:

<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> 

Bu tanıtımda, kırmızı kare 1000 milisaniyeden uzunluğunda soldan sağa 1000 piksele kadar hareket eder. Gecikme yapılmazsa, ilk 300 pikseli atlar. Gecikme ayarlanırsa, sorunsuz bir şekilde animasyon yapar. Lütfen aşağıdaki videoları izleyin.

yok gecikmesi (kareler atlıyor): https://www.youtube.com/watch?v=dEwvllhvvN0

400ms gecikme (Fames atlamak değil): https://www.youtube.com/watch?v=zW0akPhl_9I&feature=youtu.be

Herhangi yorumlarınızı bekliyoruz.

+1

Gerçekten onPause ve onSaveInstanceState yöntemlerinizi ve potansiyel olarak görünüm hiyerarşinizi göstermeniz gerekir. OnSaveInstanceState'de onPause'da özel mantık engelleme olabilir veya onSaveInstanceState'de engelleyen özel bir görünümünüz olabilir. – dcow

+0

"OnPause ve onSaveInstanceState, normal olarak, MainActivitede birbirinden 20 ms sonra gerçekleşir" ... CreatActivity'de farklı ne yapıyorsunuz? –

+0

@dcow Günlük ifadelerinin yanı sıra yöntemlerin boş olduğunu belirtmeliydim. – clocksmith

cevap

2

Bu, etkinliğin oluşturulduğunda oynatılan etkinliğin geçiş animasyonu nedeniyle gerçekleşir. Sonuç olarak, sistem geçişi çizerken meşgulken özel animasyonunuz başlar.

Henüz temiz bir çözüm bulamadım. Şimdilik, ben sadece benim animasyon başlamadan önce geçiş süresince bekliyorum, ama mükemmel olmaktan uzak olduğunu:

// 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); 

Ayrıca devre dışı etkinlik ile yerine geçişler olabilir:

overridePendingTransition(0, 0); 

Geçişin kesin bitiş zamanını dinlemenin bir yolunu arıyorum. Bir çözüm bulursam seni bilgilendiririm.