bir aktivitede parçayı animasyon yoluyla takas etme


94

Bir aktivitede iki parçayı animasyon yoluyla değiştirmek istiyorum. Sayfa A'nın ekranda A bölümü ve sol taraf için ve Sayfa B'nin B parçası için yani ekranın sağ tarafında olduğunu varsayalım. Şimdi, Sayfa A'daki bir düğmeyi tıkladığımda Sayfa A'nın biraz geçiş animasyonuyla ekranın sağ tarafına hareket etmesini istiyorum.

Pozisyonu değiştirmek için aşağıdaki kodu denedim

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Biraz ipucu arıyorum.

Şimdiden teşekkürler.


Yanıtlar:


286

Eski soru ve muhtemelen zaten anlamışsınızdır, ancak ileride başvurmak için:

Bir parçayı kodla değiştirdiğinizde özel bir animasyon ayarlamak için kullanacağınız şey:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Slide_in_left animasyonuna bir örnek:

<?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="500"/>
</set>

Uyumluluk kitaplığını kullanıyorsanız bunun animasyon olduğunu unutmayın. Bunun yerine, FragmentManager için yerel desteğe sahip bir SDK kullanıyorsanız, animasyonunuz şu şekilde görünecektir:

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

Bunun nedeni, uyumluluk kitaplığının yeni objectAnimator türünü desteklememesi ve bunun yerine yalnızca eski animasyon çerçevesini uygulamasıdır.


92
Bu kesinlikle doğru cevap. Siparişin önemli olduğuna dikkat edin! Çağrı ekleme / değiştirme çağrılarından önce setCustomAnimations () çağrısına sahip olmanız gerekir!
theelfismike

2
Peki en iyi kompozisyonu istiyorsanız hangi yaklaşımı kullanmalısınız?
basickarl

17
Bu farklı animasyonlar tam olarak eşit değil. -1280 değerinden bir değer kullanarak parçanızın genişliğinin 1280'e eşit olduğunu varsayıyorsunuz. Genişlik daha büyükse, ekrandan tamamen başlamaz.
egfconnor

53
U bunun yerine android ad alanındaki önceden tanımlanmış animasyonları kullanabilir: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy

2
Önceden tanımlanmış animasyonlar, "translate" etiketine dayandıkları için bir runtimeexception, FWIW tetikler.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.