2013-03-01 2 views
12

Questo problema si verifica solo a volte su Jelly Bean 4.1 e 4.2 (testato su Galaxy Nexus e Nexus 4). Ecco come io uso overridePendingTransitionLa schermata lampeggia in modo casuale quando si utilizza overridePendingTransition su Jelly Bean

Quando si inizia una nuova attività:

Intent intent = new Intent(ActivityA.this, ActivityB.class); 
startActivity(intent); 
overridePendingTransition(R.anim.transition_right_to_left, 
        R.anim.transition_right_to_left_out); 

Quando il rivestimento un'attività per tornare al precedente

finish(); 
overridePendingTransition(R.anim.transition_left_to_right, R.anim.transition_left_to_right_out); 

transition_left_to_right

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
android:fromXDelta="-100%p" 
android:toXDelta="0" 
android:duration="@integer/transition_duration"/> 

transition_left_to_right_out

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
android:fromXDelta="0" 
android:toXDelta="100%p" 
android:duration="@integer/transition_duration"/> 

transition_right_to_left

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:fromXDelta="100%p" 
android:toXDelta="0" 
android:duration="@integer/transition_duration"/> 

transition_right_to_left_out

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:fromXDelta="0" 
android:toXDelta="-100%p" 
android:duration="@integer/transition_duration"/> 

Ed è così che lampeggia sullo schermo: http://youtu.be/TUKRz2yVF6Q (accade solo da 01:00)

prego di dirmi se si sa che cosa è sbagliato con il mio codice e perché lo schermo del dispositivo a volte lampeggia? Grazie.

Edit: è tentato di utilizzare ActivityOptions su Jelly Bean, ma non ha aiutato

+1

è il problema venendo su un dispositivo Android specifico o tutti i dispositivi Android di supporto jelly bean? –

+0

Non so perché non ho molti dispositivi da testare tranne Galaxy Nexus e Nexus 4. – Wayne

+0

Ma è possibile provarlo con diversi emulatori con diverse versioni del sistema operativo –

risposta

5

Ho avuto lo stesso problema esatto. Sono stato in grado di risolverlo cambiando l'interpolatore in linear_interpolator invece di accelerate_decelerate_interpolator.

+0

Grazie, problema risolto! – Wayne

+1

Piacere mio, se hai postato questa domanda su altri forum, ti preghiamo di condividere anche questa soluzione ... –

2

Prova ad aggiungere la seguente riga al tuo entrambi i file XML di animazione

android:fillAfter="true" 
+1

Grazie per la tua risposta, ma questo non ha aiutato, e penso che l'animazione per overridePendingTransition non ha bisogno di fillAfter. – Wayne

+1

'fillBefore' quindi? il lampeggiamento può verificarsi se il primo fotogramma dell'animazione viene disegnato dopo che è stata disegnata la vista statica (non animata) - ad esempio è probabile che si verifichi in 'transition_left_to_right' poiché prima viene disegnata la vista di destinazione sullo schermo e inizia a uscire dallo schermo non appena inizia l'animazione –

+0

FillBefore non può essere d'aiuto. – Wayne

2

C'è qualche possibilità di avere l'opzione "Non tenere attività "attivata nella sezione Opzioni sviluppatore nelle impostazioni?

+1

Mi dispiace che l'opzione "Non tenere attività" non sia abilitata. – Wayne

-1

Suggerimento sciocco ma hai provato a modificare l'ordine di animazione/finitura()?

Ti piace questa:

overridePendingTransition(R.anim.transition_left_to_right, R.anim.transition_left_to_right_out); 
finish(); 
+1

Mi dispiace ma il documento di Android ha detto che overridePendingTransition deve essere chiamato immediatamente dopo finish() o startActivity() (http://developer.android.com/reference/android/app/Activity.html#overridePendingTransition(int, int)). Ho già provato ma ovviamente non poteva essere d'aiuto. – Wayne

0

È possibile risolvere questo problema ritardando le transizioni di attività e utilizzando alcuni elementi di visualizzazione come "ancoraggio" di transizione di elementi condivisi.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_match_score); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     getWindow().setEnterTransition(null); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // Postpone the shared element enter transition. 
     postponeEnterTransition(); 
    } 
} 

Ora è solo bisogno di chiamare 'scheduleStartPostponedTransition()' da un punto nella tua app in cui tutto dovrebbe essere visualizzato sullo schermo. Questa tecnica funziona molto bene e risolve il problema del flash dello schermo quando si cambia attività.

// 
// Schedules the shared element transition to be started immediately 
// after the shared element has been measured and laid out within the 
// activity's view hierarchy. Some common places where it might make 
// sense to call this method are: 
// 
// (1) Inside a Fragment's onCreateView() method (if the shared element 
//  lives inside a Fragment hosted by the called Activity). 
// 
// (2) Inside a Picasso Callback object (if you need to wait for Picasso to 
//  asynchronously load/scale a bitmap before the transition can begin). 
// 
// (3) Inside a LoaderCallback's onLoadFinished() method (if the shared 
//  element depends on data queried by a Loader). 
// 
public void scheduleStartPostponedTransition(final ImageView sharedElement) { 
    LogHelper.v(TAG, "scheduleStartPostponedTransition"); 
    sharedElement.getViewTreeObserver().addOnPreDrawListener(
      new ViewTreeObserver.OnPreDrawListener() { 
       @Override 
       public boolean onPreDraw() { 
        sharedElement.getViewTreeObserver().removeOnPreDrawListener(this); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         startPostponedEnterTransition(); 
        } 
        return true; 
       } 
      }); 
} 

Vedi http://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

+0

API di transizione che hai proposto è stata aggiunta in API v20 - Jelly Bean è API v16 –