Örneğin Honeycomb Gmail istemcisinin kullandığı bu tür bir kaymayı nasıl uygulamalısınız?
Can TransactionManager
ekleme ve Fragments kaldırarak otomatik olarak bu sap, bir slayt olmak emülatörü bu nedeniyle test etmek tür zor değil :)
Örneğin Honeycomb Gmail istemcisinin kullandığı bu tür bir kaymayı nasıl uygulamalısınız?
Can TransactionManager
ekleme ve Fragments kaldırarak otomatik olarak bu sap, bir slayt olmak emülatörü bu nedeniyle test etmek tür zor değil :)
Yanıtlar:
Fragmanları arasındaki geçiş canlandırmak için, ya da gösteriyor veya kullandığınız bir fragmanını gizleme işlemi animasyon Fragment Manager
bir oluşturmak Fragment Transaction
.
Her Parça İşleminde, sırasıyla gösterme ve gizleme için kullanılacak (veya değiştirme kullanıldığında her ikisi de) animasyonları girip çıkarabilirsiniz.
Aşağıdaki kod, bir parçayı kaydırarak diğerini yerine kaydırarak parçayı nasıl değiştireceğinizi gösterir.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
DetailsFragment newFragment = DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");
// Start the animated transition.
ft.commit();
Gizleme veya sadece arayacağını bir fragman gösteren aynı şeyi başarmak için ft.show
ya ft.hide
sırasıyla göstermek veya gizlemek isteyen Fragment geçen.
Başvuru için, XML animasyon tanımları objectAnimator
etiketi kullanır . Bir slide_in_left örneği şöyle görünebilir:
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="-1280"
android:valueTo="0"
android:duration="500"/>
</set>
Destek kitaplığını kullanmanız gerekmiyorsa, Romanın cevabına bir göz atın .
Ancak destek kitaplığını kullanmak istiyorsanız , aşağıda açıklandığı gibi eski animasyon çerçevesini kullanmanız gerekir.
Danıştıktan sonra Reto en ve blindstuff en cevapları aşağıdaki kod çalışma aldık.
Parçacıklar sağdan içeri ve geriye basıldığında sola doğru kayıyor gibi görünür .
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();
Sıra önemlidir. Bu, daha setCustomAnimations()
önce aramanız gerektiği replace()
veya animasyonun etkili olmayacağı anlamına gelir !
Daha sonra bu dosyaların res / anim klasörünün içine yerleştirilmesi gerekir .
enter.xml :
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%"
android:toXDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
exit.xml :
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
pop_enter.xml :
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%"
android:toXDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
pop_exit.xml :
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Animasyonların süresi, herhangi bir varsayılan değer @android:integer/config_shortAnimTime
veya başka bir sayı olarak değiştirilebilir.
Parça değiştirmeleri arasında bir yapılandırma değişikliği gerçekleşirse (örneğin döndürme) geri işlemin animasyonlu olmadığını unutmayın. Bu, destek kitaplığının rev 20'sinde hala var olan belgelenmiş bir hatadır .
Animasyon dosyası oluşturmak yerine bunu kullanmanızı şiddetle tavsiye ediyorum çünkü çok daha iyi bir çözüm. Android Studio, herhangi bir yeni XML dosyası oluşturmadan kullanabileceğiniz varsayılanı zaten sağlar animation
. Animasyonların adları android.R.anim.slide_in_left ve android.R.anim.slide_out_right şeklindedir ve bunları aşağıdaki gibi kullanabilirsiniz:
fragmentTransaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();
Çıktı:
Değiştirilmiş destek kütüphanem , Parça Geçişleri için hem Animasyonları görüntüle (yani <translate>, <rotate>
) hem de Nesne Animatörleri (ie <objectAnimator>
) kullanmayı destekler . NineOldAndroids ile uygulanır . Ayrıntılar için github ile ilgili dokümantasyona bakın.
Bana gelince, görünüm kesişmesi gerekir:
içinde -> sağdan hızlıca kaydırın
dışarı -> sola kaydır
İşte benim için çalışır kodu:
slide_in_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
slide_out_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-50%p"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
işlem kodu:
inline fun FragmentActivity.setContentFragment(
containerViewId: Int,
backStack: Boolean = false,
isAnimate: Boolean = false,
f: () -> Fragment
): Fragment? {
val manager = supportFragmentManager
return f().apply {
manager.beginTransaction().let {
if (isAnimate)
it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
if (backStack) {
it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
} else {
it.replace(containerViewId, this, "Fr").commit()
}
}
}
}
Bunu aşağıdaki şekilde çözerim
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment