9

Ben Android 5.0 Etkinlikler arasında ImageView geçişler ile ilgili garip bir sorun/hata yaşıyorum.Android 5.0 ImageView geçiş yaparken garip bir sorun

I (Activity B olarak) Fragment B başlık görüntüye (Activity A olarak) Fragment A bir küçük resim geçiş çalışıyorum. Çoğu zaman iyi çalışır, ama bazen çok az karışır.

What a mess... :-)

Doğal olarak, tüm alanı doldurmak gerekiyordu:

İşte o haberci yukarıya zaman neye benzediğini bir resmi. Her iki ImageViews, ScaleType.CENTER_CROP olarak ayarlandı, bu yüzden sorun olduğunu düşünemiyorum. meraklı Ne

sorun (her şey kaydırma üzerine ImageView dolgu değiştiren bir sınıflandırma ScrollView içinde bulunur) Activity B içinde kaydırma hemen sonra kendiliğinden düzelir olmasıdır.

Activity B başlatılması için kod oldukça basittir: Burada

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
    activity, thumbImageView, "cover"); // "cover" is the shared element name for both ImageViews 
ActivityCompat.startActivity(activity, intent, options.toBundle()); 

gözlemlenebilir ScrollView dinleyici için kod: Ayrıca

scrollview.setOnScrollChangedListener(new OnScrollChangedListener() { 
    @Override 
    public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { 
     // Such parallax, much wow 
     headerImageView.setPadding(0, (int) (t/1.5), 0, 0); 
    } 
}); 

, burada benim tema stilinin parçası:

<item name="android:windowContentTransitions">true</item> 
<item name="android:windowAllowEnterTransitionOverlap">true</item> 
<item name="android:windowAllowReturnTransitionOverlap">true</item> 
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
<item name="android:windowSharedElementExitTransition">@android:transition/move</item> 

Herhangi bir fikrin var mı?

+0

Hangi geçişleri kullanıyorsunuz? – klmprt

+0

Üzgünüm, bundan bahsetmeyi unuttum. Bu varsayılan '@android: geçiş/taşıma' geçişidir. –

+0

Hata ne sıklıkta gerçekleşir (örneğin, her seferinde rastgele vb.). Ayrıca, scroll view listener'ınızda 'setPadding()' kodunu açıklarsanız hata hala devam ediyor mu? Sadece bunun neden olabileceğinin temel sebebini anlamaya çalışıyorum. –

cevap

4

deneyin sizin Fragment B'nin onCreateView() yöntemi için aşağıdaki kodu ekleyerek: Bu kod mevcut olduğunda

getActivity().postponeEnterTransition(); 
scrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
     scrollView.getViewTreeObserver().removeOnPreDrawListener(this); 
     getActivity().startPostponedEnterTransition(); 
     return true; 
    } 
}); 

Sorun hala oluşuyor mu? Bu, geçişin yalnızca'dan sonra başlamasını sağlayarak parçanın düzenini tamamladığından emin olur.

Hatta ikinci aktivitesinde yüksek çözünürlüklü görüntü yüklüyorsanız görüntü yüklendikten sonra ... örneğin, startPostponedEnterTransition arayarak deneyin bu saatten sonra startPostponedEnterTransition() aramak gerekebilir (örneğin üzerine onPreDraw dinleyici ayarlayın Pencerenin dekor görünümü yerine ImageView.

+0

Ne yazık ki, hala gerçekleşir. ImageView, ImageView öğesinde ImageView öğesinin daha geniş sınırlarına olan sınırlarını değiştirmeden geçiş yapar gibi görünüyor. –

+1

Etkinliğin onCreate() öğesinden postPoneEnterTransition'ı çağırmanız gerekebilir. –

+0

Bunun nedenini tam olarak anladım. Etkinlik B'ye farklı (daha yüksek çözünürlükte) bir görüntü yüklenmesinden kaynaklanıyor gibi görünüyor.Daha yüksek çözünürlüklü görüntü yüklendikten sonra getActivity(). StartPostponedEnterTransition() kullanıyorum dışında teklifinizi kullandım. Optimal değil, oldukça yavaş olduğu için, ama işe yarıyor! –