TL; DR: "Gmail'in üç parçalı animasyonu" senaryosu olarak adlandıracağım şeyin eksiksiz bir çalışan örneğini arıyorum . Spesifik olarak, aşağıdaki gibi iki parça ile başlamak istiyoruz:
Bir kullanıcı arayüzü olayında (örneğin, B Parçasındaki bir şeye dokunmak), şunu istiyoruz:
- Ekrandan sola kaydırmak için Parça A
- Fragman B ekranın sol kenarına kayacak ve Fragment A tarafından boşaltılan yeri kaplayacak şekilde küçülecektir.
- C Parçası ekranın sağ tarafından içeri kayması ve B Parçası tarafından boşaltılan yeri kaplaması
Ve GERİ düğmesine basıldığında, bu işlem setinin tersine çevrilmesini istiyoruz.
Şimdi, birçok kısmi uygulama gördüm; Aşağıda dördünü gözden geçireceğim. Eksik olmanın ötesinde, hepsinin sorunları var.
@Reto Meier , aynı temel soruya bu popüler cevaba katkıda bulundu setCustomAnimations()
ve bir FragmentTransaction
. İki parçalı bir senaryo için (örneğin, başlangıçta yalnızca A Parçasını görüyorsunuz ve onu animasyonlu efektler kullanarak yeni bir B Parçası ile değiştirmek istiyorsunuz), tamamen hemfikirim. Ancak:
- Yalnızca bir "giriş" ve bir "çıkış" animasyonu belirleyebildiğiniz için, üç parçalı senaryo için gereken tüm farklı animasyonları nasıl işleyeceğinizi anlayamıyorum
<objectAnimator>
Onun örnek kodda piksel olarak sabit kablolu pozisyonları kullanır ve bu ekran boyutları değişen verilen pratik olacak gibi görünüyor, henüzsetCustomAnimations()
Java bunları tanımlayan artması önlenir, animasyon kaynak gerektirir- Şeylerle ölçek kravat nesne animatörler gibi nasıl şekilde bir kayıp am
android:layout_weight
bir deLinearLayout
yüzde bazında yer tahsisi için - Ben Fragman C başlangıçta nasıl işleneceğini olarak bir kayıp am (
GONE
?android:layout_weight
Ait0
? Başka 0? Şeyin bir ölçeğe ön animasyon?)
@Roman Nurik , kendi tanımladığınız özellikler de dahil olmak üzere herhangi bir özelliği canlandırabileceğinizi belirtiyor. Bu, kendi özel düzen yöneticisi alt sınıfınızı icat etme pahasına, fiziksel bağlantılı pozisyonlar sorununu çözmeye yardımcı olabilir. Bu bazılarına yardımcı olur, ancak Reto'nun çözümünün geri kalanından hala şaşkınım.
Bu pastebin girişinin yazarı , temel olarak üç parçanın da başlangıçta bir hide()
işlem işlemi yoluyla Fragment C gizlenerek, başlangıçta konteynerde yer alacağını söyleyerek bazı kışkırtıcı sözde kodlar gösteriyor . Sonra show()
C ve hide()
A UI olay meydana geldiğinde. Ancak, B'nin boyut değiştirdiği gerçeğini nasıl ele aldığını anlamıyorum. Aynı konteynere birden fazla parça ekleyebileceğiniz gerçeğine de dayanıyor ve bunun uzun vadede güvenilir bir davranış olup olmadığından emin değilim (bununla findFragmentById()
yaşayabilsem de kırılması gerektiğini belirtmiyorum).
Bu blog gönderisinin yazarı, Gmail'in hiç kullanmadığını setCustomAnimations()
, bunun yerine doğrudan nesne animatörlerini kullandığını belirtir ("kök görünümün sol kenar boşluğunu değiştirirsiniz + sağ görünümün genişliğini değiştirirsiniz"). Bununla birlikte, bu hala iki parçalı bir çözüm AFAICT'dir ve uygulama bir kez daha sert kabloları piksel olarak gösterir.
Bu konuyu kapatmaya devam edeceğim, bu yüzden bir gün bunu kendim yanıtlayabilirim, ama gerçekten birinin bu animasyon senaryosu için üç parçalı çözümü bulduğunu ve kodu (veya oraya bir bağlantı) gönderebileceğini umuyorum. Android'deki animasyonlar saçlarımı koparmak istememe neden oluyor ve beni görenleriniz bunun büyük ölçüde sonuçsuz bir çaba olduğunu biliyor.