Sto animando una vista in un'attività dopo che onGlobalLayoutFinished
è stato chiamato sulla vista. La mia animazione sta saltando ~ 300 ms valore di frame all'inizio. Se ritarda l'animazione di oltre ~ 300 ms, non salta nessun fotogramma. Che cosa sta succedendo nell'attività che sta causando questo? Come posso fermarlo o come posso ascoltarlo quando è finito?L'animazione all'inizio dell'attività salta i fotogrammi
Ho creato un'app semplicemente semplice per dimostrare questo comportamento.
contenuto di <application>
in 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>
In questa demo, un quadrato rosso si sposta da sinistra a destra di 1000 pixel su 1000 millisecondi. Se non è impostato alcun ritardo, salta all'incirca i primi 300 pixel. Se è impostato un ritardo, si anima senza intoppi. Si prega di vedere i video qui sotto.
Nessun ritardo (salta fotogrammi): https://www.youtube.com/watch?v=dEwvllhvvN0
400ms ritardo (non salta fames): https://www.youtube.com/watch?v=zW0akPhl_9I&feature=youtu.be
Eventuali commenti sono benvenuti.
È davvero necessario mostrare i metodi onPause e onSaveInstanceState e potenzialmente la gerarchia delle viste. Potresti avere un blocco logico personalizzato in onPause prima di onSaveInstanceState o potresti avere una vista personalizzata che blocca in onSaveInstanceState. – dcow
"onPause e onSaveInstanceState normalmente avvengono entro 20 ms l'uno dall'altro in MainActivity" ... cosa stai facendo in CreatActivity in modo diverso? –
@dcow Avrei dovuto accennare che i metodi sono vuoti, oltre alle istruzioni del registro. – clocksmith