Mülk animasyon sistemi, size reklam göstermek için animasyon oluşturmak için kullanılır. Herhangi bir nesne özelliğini zaman içinde değiştirecek bir animasyon tanımlayabilir, ekrana getirilip gelmemesinden bağımsız olarak. Mülk animasyonu, bir mülkün (nesnedeki bir alan) değerinin belirtilen bir süre boyunca nasıl görüneceğini belirler. Bir şeye animasyon eklemek için canlandırmak istediğiniz nesne özelliği (ör. bir nesnenin ekrandaki konumu, ve hangi değerler arasında animasyon eklemek istediğinizi seçebilirsiniz.
Mülk animasyonu sistemi, bir öğenin aşağıdaki özelliklerini tanımlayabilmenizi sağlar: animasyon:
- Süre: Animasyonun süresini belirtebilirsiniz. Varsayılan uzunluk 300 ms'dir.
- Zaman interpolasyonu: Mülke ait değerlerin nasıl hesaplanacağını belirtebilirsiniz. animasyon için geçerli geçen sürenin işlevi.
- Tekrar sayısı ve davranışı: bir sürenin sonuna geldiğini ve animasyonun kaç kez tekrarlanacağını belirtir. Ayrıca transkriptinizi animasyonun tersten oynatılmasını isteyip istemediğinizi belirtin. Oynatmaları tersine çevirmek üzere ayarlama animasyon, tekrar sayısına ulaşılana kadar tekrar tekrar ileri ve sonra geri gider.
- Animatör grupları: Animasyonları, birlikte oynatılan mantıksal kümeler halinde gruplandırabilirsiniz. veya belirtilen gecikmelerin ardından takip etmelisiniz.
- Kare yenileme gecikmesi: Animasyonunuzun karelerinin ne sıklıkta yenileneceğini belirtebilirsiniz. İlgili içeriği oluşturmak için kullanılan varsayılan ayar her 10 ms'de bir yenilenecek şekilde ayarlanmıştır, ancak uygulamanızın kareleri yenileme hızı bu durum, son olarak sistemin genel olarak ne kadar dolu olduğuna ve sistemin temel zamanlayıcıyı ne kadar hızlı işleyebileceğine bağlıdır.
Mülk animasyonunun tam bir örneğini görmek için
CustomTransition'daki ChangeColor
sınıfı
örneği ziyaret edin.
Mülk animasyonu nasıl çalışır?
İlk olarak, basit bir örnekle animasyonun
nasıl çalıştığını inceleyelim. Şekil 1'de
x
özelliğiyle canlandırılmış, bu özelliği temsil eden varsayımsal nesne
konumlandırabilirsiniz. Animasyonun süresi 40 ms'ye ve mesafe
seyahat 40 pikseldir. Varsayılan kare yenileme hızı olan 10 ms'de bir nesne hareket eder
10 piksel ekleyeceksiniz. 40 ms. sonunda animasyon durur ve nesne
yatay konum 40. Bu, doğrusal interpolasyon türüne sahip bir animasyon örneğidir.
Nesne sabit bir hızda hareket eder.
Animasyonları, doğrusal olmayan interpolasyona sahip olacak şekilde de belirtebilirsiniz. Şekil 2'de animasyonun başında hızla hızlanan ve hızlandığı şekilde yavaşlayan varsayımsal nesne sona erecektir. Nesne 40 ms'de 40 piksel hareket eder, ancak doğrusal değildir. bu animasyon yarı noktaya kadar hızlanır ve ardından sonuna geldik. Şekil 2'de gösterildiği gibi, katedilen mesafe ortadakinden daha az olması gerekir.
Mülk animasyon sisteminin önemli bileşenlerine göz atalım. yukarıda gösterilenler gibi animasyonlar hesaplar. Şekil 3'te ana sınıfların daha iyi olur.
ValueAnimator
nesnesi, animasyonunuzun zamanlamasını takip eder.
animasyonun ne kadar süredir çalıştığı ve etkinleştirildiği özelliğin geçerli değeri gibi
daha fazla bilgi edineceksiniz.
ValueAnimator
, animasyon interpolasyonunu tanımlayan bir TimeInterpolator
ve gösterilen özelliğin değerlerinin nasıl hesaplanacağını tanımlayan bir TypeEvaluator
içerir.
animasyonlu. Örneğin, Şekil 2'de, TimeInterpolator
değeri şöyle olacaktır:
AccelerateDecelerateInterpolator
ve TypeEvaluator
, IntEvaluator
olacaktır.
Animasyon başlatmak için bir ValueAnimator
oluşturun ve
canlandırmak istediğiniz mülk için başlangıç ve bitiş değerleriyle birlikte
tıklayın. start()
öğesini çağırdığınızda animasyon
başlar. Animasyonun tamamı boyunca ValueAnimator
, geçen kesri hesaplar
0 ile 1 arasında bir değerdir. İlgili içeriği oluşturmak için kullanılan
geçen oran, animasyonun tamamlandığı sürenin yüzdesini temsil eder; 0, %0 anlamına gelir
ve 1, %100 anlamına gelir. Örneğin, Şekil 1'de, t = 10 ms'de geçen oran 0,25 olur
çünkü toplam süre t = 40 ms.
ValueAnimator
, geçen kesri hesapladığı zaman
değerini hesaplamak için şu anda ayarlanmış olan TimeInterpolator
değerini
etkileşimli kesir. İnterpolasyonlu kesir, geçen kesri yeni bir kesirle
hesaplanan zaman interpolasyonunu hesaba katan oran. Örneğin, Şekil 2'de,
animasyon yavaşça hızlandığı için interpolasyon oranı (yaklaşık 0,15)
geçen kesir, 0,25, t = 10 ms'de. Şekil 1'de, interpolasyon kesir her zaman
geçen kesir.
İnterpolasyon oranı hesaplandığında ValueAnimator
,
değerini hesaplamak için uygun TypeEvaluator
interpolasyon kesri, başlangıç değeri ve
animasyonun bitiş değeri. Örneğin, Şekil 2'de interpolasyon oranı 0,15, t = ise
10 ms .de, özelliğin o anki değeri 0,15 × (40 - 0) veya 6 olur.
Mülk animasyonunun görünüm animasyonundan farkı nedir?
Görüntüleme animasyon sistemi, yalnızca View
animasyonunu oluşturma olanağı sağlar.
View
dışındaki nesnelere animasyon eklemek istiyorsanız
oluşturmanız gerekir. Görüntüleme animasyonu sistemi yalnızca
canlandırmak için bir View
nesnesinin ölçeklendirme ve
bir Görünümü döndürebilir, ancak arka plan rengini değiştirebilirsiniz.
Görüntüleme animasyonu sisteminin başka bir dezavantajı, yalnızca Görünüm çizilmiştir, asıl Görünüm değildir. Örneğin, bir düğmeyi kullanmak için bir düğmeyi ekranda gördüğünüz şekilde, düğme doğru çiziliyor, ancak düğmeyi düğmesi değişmez; dolayısıyla, bunu işlemek için kendi mantığınızı uygulamanız gerekir.
Özellik animasyon sistemiyle bu kısıtlamalar tamamen kaldırılır ve herhangi bir nesnenin herhangi bir özelliği (Views ve View olmayanlar) ve nesnenin kendisi gerçekte değiştirilir. Özellik animasyon sistemi, animasyonu yürütme açısından da daha sağlamdır. Kuyruklu a işareti bir üst düzeyde, animasyon oluşturmak istediğiniz özelliklere (örneğin, renk, ve interpolasyon gibi animasyonun çeşitli yönlerini tanımlayabilir. senkronizasyonuna yardımcı olur.
Ancak görüntüleme animasyonu sisteminin ayarlanması daha kısa sürer ve yazmak için daha az kod gerekir. Görüntüleme animasyonu, yapmanız gereken her şeyi yapıyorsa veya mevcut kodunuz zaten istiyorsanız, özellik animasyon sistemini kullanmanıza gerek yoktur. Ayrıca kullanım alanı ortaya çıkıyorsa farklı durumlar için her iki animasyon sistemini de kullanmak mantıklıdır.
API'ye genel bakış
Mülk animasyon sisteminin API'lerinin çoğunu android.animation
içinde bulabilirsiniz. Görüntüleme animasyon sistemi zaten
android.view.animation
bölgesinde birçok arapolatör tanımlar.
arapolatörleri de yükleyebilirsiniz. Aşağıdaki tablolarda, kampanyalarınızın
bileşenlerine ayıralım.
Animator
sınıfı, içerik oluşturmak için temel yapıyı sağlar
animasyonları da ekler. Minimum düzeyde sağlandığı için, normalde bu sınıfı doğrudan kullanmıyorsunuz
animasyon değerlerini tam olarak destekleyecek şekilde genişletilmesi gereken işlevler. Aşağıdakiler
alt sınıflar Animator
uzantısına sahiptir:
Sınıf | Açıklama |
---|---|
ValueAnimator |
Ayrıca,
animasyona sahip olması gerekir. Animasyonu hesaplayan temel işlevlerin hepsine sahip
değerlerini içerir ve her animasyonun zamanlama ayrıntılarını içerir; animasyonun
animasyon tekrarları, güncelleme etkinliklerini alan işleyiciler ve özel ayarlamalar
farklı türler var. Özelliklere animasyon eklemek için iki adım vardır: animasyonlu öğeleri hesaplama
animasyonlu nesnede ve mülkte bu değerleri ayarlayarak ValueAnimator ikinci parçayı çalmıyor, bu yüzden dinlemeniz gerekiyor
ve ValueAnimator ve
canlandırmak istediğiniz nesneleri kendi mantığınızla değiştirin. Bkz.
Daha fazla bilgi için ValueAnimator ile animasyon oluşturma. |
ObjectAnimator |
Hedef ayarlamanıza olanak tanıyan bir ValueAnimator alt sınıfı
nesne ve nesne özelliklerini kontrol edin. Bu sınıf, aşağıdaki durumlarda mülkü uygun şekilde günceller:
animasyon için yeni bir değer hesaplar. Şunu kullanmak için:
ObjectAnimator , çoğu zaman
çünkü hedef nesnelerde değer animasyonunu çok daha kolay hale getirir. Ancak,
ObjectAnimator üzerinde belirli bir kısıtlamanın uygulanmasını zorunlu kılma gibi bazı ek kısıtlamaları olduğu için, ValueAnimator bazen doğrudan
erişimci yöntemlerinin mevcut olması gerekir. |
AnimatorSet |
Animasyonların belirli bir konumda çalıştırılması için bir grup mekanizması sağlar. güven içinde olur. Animasyonları birlikte, sırayla veya sonra oynatılacak şekilde ayarlayabilirsiniz. belirtilen bir gecikme. Birden fazla koeografi oluşturma animasyonlara göz atabilirsiniz. |
Değerlendiriciler, mülk animasyon sistemine belirli bir için değerlerin nasıl hesaplanacağını
Bir Animator
tarafından sağlanan zamanlama verilerini alırlar.
sınıfını, animasyonun başlangıç ve bitiş değerlerini belirler ve özelliğin animasyonlu değerlerini hesaplar
bu verileri temel alır. Özellik animasyon sistemi aşağıdaki değerlendiricileri sağlar:
Sınıf/Arayüz | Açıklama |
---|---|
IntEvaluator |
int özelliklerinin değerlerini hesaplayan varsayılan değerlendirici. |
FloatEvaluator |
float özelliklerinin değerlerini hesaplayan varsayılan değerlendirici. |
ArgbEvaluator |
Temsil edilen renk özelliklerinin değerlerini hesaplamak için kullanılan varsayılan değerlendirici onaltılık değerler olarak gösterilir. |
TypeEvaluator |
Kendi değerlendiricinizi oluşturmanıza olanak tanıyan arayüz. Bir
int , float veya renk olmayan nesne özelliği
nasıl kullanılacağını belirtmek için TypeEvaluator arayüzünü
işlevini kullanın. Ayrıca int , float ve renk için özel bir TypeEvaluator belirtebilirsiniz
değerleri de belirleyebilirsiniz.
Daha fazla bilgi için TypeEvaluator Kullanma başlıklı bölüme bakın
özel değerlendirmeci yazma hakkında bilgi edinin. |
Zaman interpolatörü, bir animasyondaki belirli değerlerin
zaman fonksiyonu. Örneğin, animasyonların bütününde doğrusal olarak gerçekleşecek şekilde
Animasyonlar, yani animasyon tüm süre boyunca eşit olarak hareket eder. Dilerseniz bu animasyonları
doğrusal olmayan zaman kullanmak için, örneğin, başlangıçta hızlanan ve
sona erecektir. Tablo 3'te, android.view.animation
hücresinde yer alan interpolatörler açıklanmaktadır. Sağlanan interpolatörlerin hiçbiri uygun değilse
TimeInterpolator
arayüzünü uygulayın ve kendi arayüzünüzü oluşturun. Özel bir veri yazma hakkında daha fazla bilgi için Arapolatörleri kullanma bölümüne bakın
arapolatörde olur.
Sınıf/Arayüz | Açıklama |
---|---|
AccelerateDecelerateInterpolator |
Değişim hızı yavaş başlayıp biten ancak hızlanan bir interpolatör ortaya çıkar. |
AccelerateInterpolator |
Değişim hızı yavaş başlayıp sonra başlayan bir interpolatör hızlanır. |
AnticipateInterpolator |
Değişimi geriye başlayıp ileriye doğru ilerleyen bir interpolatör. |
AnticipateOvershootInterpolator |
Değişimi geriye başlayıp ileri doğru fırlayan ve hedefi aşan bir interpolatör ve son olarak son değere geri döner. |
BounceInterpolator |
Sonunda değişimi geri gelen bir interpolatör. |
CycleInterpolator |
Animasyonu belirli sayıda döngü boyunca tekrarlanan bir ara değer belirleyici. |
DecelerateInterpolator |
Değişim hızı hızlı başlayıp sonra hemen başlayan bir interpolatör yavaşlar. |
LinearInterpolator |
Değişim hızı sabit olan interpolatör. |
OvershootInterpolator |
Değişimi ileri sararak son değeri geçen bir interpolatör geri dönüyor. |
TimeInterpolator |
Kendi interpolatörünüzü uygulamanıza olanak tanıyan bir arayüz. |
ValueAnimator kullanarak animasyon oluşturma
ValueAnimator
sınıfı,
int
, float
veya renk grubu belirterek bir animasyonun süresi
değerleri girin. Şu numaralardan birini arayarak ValueAnimator
alabilirsiniz:
fabrika yöntemleri: ofInt()
, ofFloat()
veya ofObject()
. Örnek:
Kotlin
ValueAnimator.ofFloat(0f, 100f).apply { duration = 1000 start() }
Java
ValueAnimator animation = ValueAnimator.ofFloat(0f, 100f); animation.setDuration(1000); animation.start();
Bu kodda, ValueAnimator
animasyonu, start()
yöntemi çalıştırıldığında 1.000 ms'lik bir süreyle 0 ile 100 arasında bir değere ayarlanır.
Ayrıca, aşağıdakileri yaparak animasyon oluşturmak için özel bir tür de belirtebilirsiniz:
Kotlin
ValueAnimator.ofObject(MyTypeEvaluator(), startPropertyValue, endPropertyValue).apply { duration = 1000 start() }
Java
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue); animation.setDuration(1000); animation.start();
Bu kodda, ValueAnimator
animasyonu için, startPropertyValue
ile endPropertyValue
arasında
mantık, start()
yöntemi çalıştığında MyTypeEvaluator
tarafından 1000 ms boyunca sağlanır.
Animasyonun değerlerini,
AnimatorUpdateListener
.
ValueAnimator
nesnesine,
şu kodu kullanabilirsiniz:
Kotlin
ValueAnimator.ofObject(...).apply { ... addUpdateListener { updatedAnimation -> // You can use the animated value in a property that uses the // same type as the animation. In this case, you can use the // float value in the translationX property. textView.translationX = updatedAnimation.animatedValue as Float } ... }
Java
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator updatedAnimation) { // You can use the animated value in a property that uses the // same type as the animation. In this case, you can use the // float value in the translationX property. float animatedValue = (float)updatedAnimation.getAnimatedValue(); textView.setTranslationX(animatedValue); } });
onAnimationUpdate()
içinde
yönteminde güncellenmiş animasyon değerine erişebilir ve bunu
görüntülemelerinizden biri. Dinleyiciler hakkında daha fazla bilgi için
Animasyon işleyicileri.
ObjectAnimator'ı kullanarak animasyon yapma
ObjectAnimator
, ValueAnimator
sınıfının bir alt sınıfıdır (bir önceki bölümde açıklanmıştır) ve zamanlamayı birleştirmektedir
ValueAnimator
için motor ve değer hesaplaması
bir hedef nesnenin adlandırılmış özelliğine animasyon ekleme. Bu yöntem, nesneye animasyon eklemeyi çok daha kolay hale getirir.
ValueAnimator.AnimatorUpdateListener
öğesini uygulamanız gerekmiyorsa,
çünkü animasyonlu özellik otomatik olarak güncellenir.
ObjectAnimator
örneğini örneklendirmek ValueAnimator
ile benzerdir, ancak nesneyi ve bu nesnenin özelliğinin adını da belirtirsiniz (
a String) ve şunlar arasında animasyon eklenecek değerler:
Kotlin
ObjectAnimator.ofFloat(textView, "translationX", 100f).apply { duration = 1000 start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(textView, "translationX", 100f); animation.setDuration(1000); animation.start();
ObjectAnimator
güncelleme özelliklerini almak için
doğru şekilde kullanmak için aşağıdakileri yapmanız gerekir:
- Animasyonunu uyguladığınız nesne özelliğinin,
set<PropertyName>()
ÇünküObjectAnimator
animasyon sırasında özelliği otomatik olarak güncellediğinde, seçeceğim. Örneğin, tesis adıfoo
ise şunu yapmanız gerekir:setFoo()
yöntemine sahip. Bu belirleyici yöntem yoksa üç tane seçenekler:- Yapma hakkınız varsa belirleyici yöntemini sınıfa ekleyin.
- Değiştirme hakkına sahip olduğunuz bir sarmalayıcı sınıfı kullanın ve bu sarmalayıcının değerini geçerli bir setter yöntemiyle oluşturmalı ve bunu orijinal nesneye iletmelidir.
- Bunun yerine
ValueAnimator
politikasını kullanın.
ObjectAnimator
fabrika yöntemlerinden birindevalues...
parametresi için yalnızca bir değer belirtirseniz bunun animasyon ekler. Bu nedenle, canlandırdığınız nesne özelliğinin bir alıcı işlevi olmalıdır. animasyonun başlangıç değerini elde etmek için kullanılan bir değerdir. Alıcı işleviget<PropertyName>()
biçiminde olmalıdır. Örneğin, tesis adıfoo
,getFoo()
yönteminizin olması gerekir.- Animasyonunu yapmakta olduğunuz özelliğin alıcı (gerekirse) ve belirleyici yöntemleri,
ObjectAnimator
için belirttiğiniz başlangıç ve bitiş değerleriyle aynı tür üzerinde çalışır. Örneğin,targetObject.setPropName(float)
targetObject.getPropName()
aşağıdakiObjectAnimator
öğesini oluşturursanız:ObjectAnimator.ofFloat(targetObject, "propName", 1f)
- Animasyon uyguladığınız özellik veya nesneye bağlı olarak,
invalidate()
kullanarak ekranı animasyonlu değerler güncellendi. Bu işlemionAnimationUpdate()
. geri arama. Örneğin, bir Çizilebilir nesnenin renk özelliğini canlandırmak, yalnızca yeniden çizmeye başlar. View'daki mülk belirleyicilerin tümü, örneğinsetAlpha()
setTranslationX()
görünümü uygun şekilde geçersiz kılar, dolayısıyla bu öğeleri çağırırken Görünümü geçersiz kılmanıza gerek kalmaz yöntemlerine yer verir. Dinleyiciler hakkında daha fazla bilgi için Animasyon işleyicileri.
AnimatorSet kullanarak birden çok animasyonun koreografisini oluşturun
Çoğu durumda, başka bir animasyonun ne zaman başladığına veya
bitirir. Android sistemi, animasyonları bir AnimatorSet
halinde gruplandırmanıza olanak tanır. Böylece animasyonların başlatılıp başlatılmayacağını belirtebilirsiniz.
aynı anda, ardışık olarak veya belirtilen bir gecikmenin ardından Ayrıca AnimatorSet
nesneleri iç içe yerleştirebilirsiniz.
Aşağıdaki kod snippet'i şu Animator
komutunu oynatır:
izin verir:
bounceAnim
oynar.squashAnim1
,squashAnim2
,stretchAnim1
ve oynar aynı andastretchAnim2
.bounceBackAnim
oynar.fadeAnim
oynar.
Kotlin
val bouncer = AnimatorSet().apply { play(bounceAnim).before(squashAnim1) play(squashAnim1).with(squashAnim2) play(squashAnim1).with(stretchAnim1) play(squashAnim1).with(stretchAnim2) play(bounceBackAnim).after(stretchAnim2) } val fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f).apply { duration = 250 } AnimatorSet().apply { play(bouncer).before(fadeAnim) start() }
Java
AnimatorSet bouncer = new AnimatorSet(); bouncer.play(bounceAnim).before(squashAnim1); bouncer.play(squashAnim1).with(squashAnim2); bouncer.play(squashAnim1).with(stretchAnim1); bouncer.play(squashAnim1).with(stretchAnim2); bouncer.play(bounceBackAnim).after(stretchAnim2); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f); fadeAnim.setDuration(250); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(bouncer).before(fadeAnim); animatorSet.start();
Animasyon dinleyicileri
Aşağıda açıklanan işleyicilerle birlikte bir animasyonun süresi boyunca önemli etkinlikleri dinleyebilirsiniz.
Animator.AnimatorListener
onAnimationStart()
. - Animasyon başladığında çağrılır.onAnimationEnd()
- Animasyon sona erdiğinde çağrılır.onAnimationRepeat()
- Animasyon kendini tekrar ettiğinde çağrılır.onAnimationCancel()
- Animasyon iptal edildiğinde çağrılır. İptal edilmiş bir animasyon ayrıcaonAnimationEnd()
araması yapıyor nasıl sonlandırıldığından bağımsız olarak.
ValueAnimator.AnimatorUpdateListener
-
onAnimationUpdate()
: Animasyonun her karesinde çağrılır. Bu etkinliği dinleyin sırasındaValueAnimator
tarafından oluşturulan hesaplanan değerleri kullanın animasyon ekler. Değeri kullanmak içinValueAnimator
nesnesini sorgulayıngetAnimatedValue()
yöntemiyle geçerli animasyonlu değeri almak için etkinliğe geçirilir. Bunu uygulamakValueAnimator
kullanıyorsanız işleyici gerekir.Canlandırmak istediğiniz özellik veya nesneye bağlı olarak,
invalidate()
seçeneğini kullanarak yeni animasyonlu değerlerle kendisini yeniden çizecek. Örneğin, bir Çekilebilir nesnenin renk özelliği, yalnızca söz konusu nesne bu nesnede ekranda güncellemelere neden yeniden çizer. View'daki tüm mülk belirleyicileri,setAlpha()
vesetTranslationX()
, görünümü geçersiz kılar düzgün şekilde kullandığından, bu yöntemleri yeni değerlerle çağırırken Görünümü geçersiz kılmanız gerekmez.
-
Şu yerine AnimatorListenerAdapter
sınıfını uzatabilirsiniz:
Animator.AnimatorListener
arayüzünü uygulamazsanız,
tüm Animator.AnimatorListener
yöntemlerini uygulamak istiyorsanız
kullanır. AnimatorListenerAdapter
sınıfı boş değer sağlar
kullanabileceğiniz yöntemleri öğrendiniz.
Örneğin, aşağıdaki kod snippet'i bir AnimatorListenerAdapter
oluşturur
yalnızca onAnimationEnd()
için
geri arama:
Kotlin
ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f).apply { duration = 250 addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { balls.remove((animation as ObjectAnimator).target) } }) }
Java
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f); fadeAnim.setDuration(250); fadeAnim.addListener(new AnimatorListenerAdapter() { public void onAnimationEnd(Animator animation) { balls.remove(((ObjectAnimator)animation).getTarget()); }
ViewGroup nesnelerinde yapılan düzen değişikliklerini canlandırma
Özellik animasyon sistemi, ViewGroup nesnelerindeki değişiklikleri animasyon haline getirme olanağı sağlar ve View nesnelerine animasyon eklemenin kolay bir yolunu sunuyor.
ViewGroup içindeki düzen değişikliklerini
LayoutTransition
sınıf. ViewGroup içindeki görünümler
eklediğinizde görünen ve kaybolan bir animasyona yer verir.
bir ViewGroup'tan veya Görünümün
setVisibility()
yöntemi
VISIBLE
, INVISIBLE
veya
GONE
. ViewGroup'taki kalan Görünümler de
Yeni konumlarında animasyonlu bir görünüm oluşturabilirsiniz. Anahtar kelimelerin
bir LayoutTransition
nesnesinde aşağıdaki animasyonlar
setAnimator()
numaralı telefonu arayarak
Animator
nesnesini
aşağıdaki LayoutTransition
sabit değer:
APPEARING
- Aynı öğede bulunan öğelerde çalıştırılan animasyonu belirten görünür.CHANGE_APPEARING
- Aynı öğede bulunan öğelerde çalıştırılan animasyonu belirten değişmesini sağlar.DISAPPEARING
- Aynı öğede bulunan öğelerde çalıştırılan animasyonu belirten ortadan kaldırır.CHANGE_DISAPPEARING
- Şu öğelerde çalıştırılan animasyonu gösteren bir işaret: bir öğenin kapsayıcıdan kaybolması nedeniyle değişiyor.
Görünümü özelleştirmek amacıyla bu dört etkinlik türü için kendi özel animasyonlarınızı tanımlayabilirsiniz ayarlayabilir veya animasyon sistemine varsayılan animasyonları kullanmasını söyleyebilirsiniz.
için android:animateLayoutchanges
özelliğini true
olarak
ViewGroup şunları yapar:
<LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/verticalContainer" android:animateLayoutChanges="true" />
Bu özellik true (doğru) değerine ayarlanırsa, ViewGroup'un yanı sıra ViewGroup'taki kalan Görünümler.
Görünüm durumu değişikliklerini StateListAnimator kullanarak canlandırma
StateListAnimator
sınıfı,
bir görünümün durumu değişir. Bu nesne, bir
Animator
nesnesi çağrılır ve
görünüm durumundaki (ör. "basılmış" veya "odaklanmış") değişiklikler.
StateListAnimator
, kök içeren bir XML kaynağında tanımlanabilir
Her birinin belirttiği <selector>
öğesi ve alt <item>
öğeleri
StateListAnimator
sınıfı tarafından tanımlanan farklı bir görünüm durumu. Her biri
<item>
, bir özellik animasyonu grubunun tanımını içerir.
Örneğin, aşağıdaki dosya x ve y ölçeğini değiştiren bir durum listesi animatörü oluşturur görünümünün gerisinde kalır:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- the pressed state; increase x and y size to 150% --> <item android:state_pressed="true"> <set> <objectAnimator android:propertyName="scaleX" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1.5" android:valueType="floatType"/> <objectAnimator android:propertyName="scaleY" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1.5" android:valueType="floatType"/> </set> </item> <!-- the default, non-pressed state; set x and y size to 100% --> <item android:state_pressed="false"> <set> <objectAnimator android:propertyName="scaleX" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1" android:valueType="floatType"/> <objectAnimator android:propertyName="scaleY" android:duration="@android:integer/config_shortAnimTime" android:valueTo="1" android:valueType="floatType"/> </set> </item> </selector>
Bir görünüme durum listesi animatörü eklemek için
android:stateListAnimator
özelliğini aşağıdaki gibi tanımlar:
<Button android:stateListAnimator="@xml/animate_scale" ... />
Artık animate_scale.xml
işlevinde tanımlanan animasyonlar, bu düğmenin
kullanabilirsiniz.
Bunun yerine, kodunuzdaki bir görünüme bir durum listesi animatörü atamak için
AnimatorInflater.loadStateListAnimator()
yöntemini kullanın ve animatörü
View.setStateListAnimator()
yöntemiyle değiştirin.
Dilerseniz görünümün özelliklerini animasyonla oluşturmak yerine,
AnimatedStateListDrawable
kullanarak durum değişiklikleri hakkında bilgi edinin.
Widget'lardaki bazı sistem widget'ları
Android 5.0, varsayılan olarak bu animasyonları kullanır. Aşağıdaki örnekte,
AnimatedStateListDrawable
öğesini XML kaynağı olarak tanımlamak için:
<!-- res/drawable/myanimstatedrawable.xml --> <animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- provide a different drawable for each state--> <item android:id="@+id/pressed" android:drawable="@drawable/drawableP" android:state_pressed="true"/> <item android:id="@+id/focused" android:drawable="@drawable/drawableF" android:state_focused="true"/> <item android:id="@id/default" android:drawable="@drawable/drawableD"/> <!-- specify a transition --> <transition android:fromId="@+id/default" android:toId="@+id/pressed"> <animation-list> <item android:duration="15" android:drawable="@drawable/dt1"/> <item android:duration="15" android:drawable="@drawable/dt2"/> ... </animation-list> </transition> ... </animated-selector>
TypeEvaluator Kullanma
Android sisteminin tanımadığı bir türün animasyonunu yapmak istiyorsanız kendi
değerlendirici olarak TypeEvaluator
arayüzünü uygulayabilirsiniz. Google Ads'de
int
, float
veya bir renkle ifade edilir.
IntEvaluator
, FloatEvaluator
ve ArgbEvaluator
türü tarafından desteklenir
size yardımcı olur.
TypeEvaluator
kampanyasında uygulanacak yalnızca bir yöntem vardır.
arayüzü, evaluate()
yöntemi. Bu da
animasyonlu mülkünüz için uygun bir değeri döndürmek amacıyla
animasyonun geçerli noktasını seçin. FloatEvaluator
sınıfında şunlar gösterilir:
bunu nasıl yapabilirsiniz?
Kotlin
private class FloatEvaluator : TypeEvaluator<Any> { override fun evaluate(fraction: Float, startValue: Any, endValue: Any): Any { return (startValue as Number).toFloat().let { startFloat -> startFloat + fraction * ((endValue as Number).toFloat() - startFloat) } } }
Java
public class FloatEvaluator implements TypeEvaluator { public Object evaluate(float fraction, Object startValue, Object endValue) { float startFloat = ((Number) startValue).floatValue(); return startFloat + fraction * (((Number) endValue).floatValue() - startFloat); } }
Not: ValueAnimator
(veya ObjectAnimator
) çalıştırıldığında,
animasyonu (0 ile 1 arasında bir değer) içerir ve ardından,
bağlantı kurmalısınız. İnterpolasyon oranı, TypeEvaluator
metriğinizin fraction
parametresi üzerinden aldığı değerdir. Dolayısıyla,
Animasyonlu değerleri hesaplarken ara değer hesaplamasını dikkate almak zorunda değildir.
İnterpolatör kullanma
Ara değer belirleyici, bir animasyondaki belirli değerlerin gerekir. Örneğin, animasyonları doğrusal olarak tüm animasyonda gerçekleşecek şekilde ayarlayabilirsiniz. Bu da animasyonun tüm zaman boyunca eşit olarak hareket edeceği anlamına gelir veya animasyonların doğrusal olmayan zaman; örneğin, 2-10 ila 25 saniyede ivme veya yavaşlama animasyon ekler.
Animasyon sistemindeki interpolatörler, animatörlerden
geçen süreyi ifade eder. İnterpolatörler bu kesri, istenilen türe denk gelecek şekilde değiştirir
animasyon içerir. Android sistemi, Google Analytics 4'te bir dizi ortak interpolatör
android.view.animation package
. Bunların hiçbiri
TimeInterpolator
arayüzünü uygulayabilir ve
sahip olmalıdır.
Örneğin, varsayılan interpolatör AccelerateDecelerateInterpolator
ve LinearInterpolator
, interpolasyonlu kesirleri nasıl hesapladığı aşağıda karşılaştırılmıştır.
LinearInterpolator
metriğinin, geçen kesir üzerinde herhangi bir etkisi yoktur. AccelerateDecelerateInterpolator
, animasyona doğru hızlanır ve
yavaşlar. Aşağıdaki yöntemler bu interpolatörlerin mantığını tanımlar:
AccelerateDecelerateInterpolator
Kotlin
override fun getInterpolation(input: Float): Float = (Math.cos((input + 1) * Math.PI) / 2.0f).toFloat() + 0.5f
Java
@Override public float getInterpolation(float input) { return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; }
Doğrusal İnterpolator
Kotlin
override fun getInterpolation(input: Float): Float = input
Java
@Override public float getInterpolation(float input) { return input; }
Aşağıdaki tabloda, bu sinyaller ile hesaplanan yaklaşık değerler gösterilmektedir 1.000 ms süren bir animasyon için arapolatörler:
geçen süre (ms) | Geçen kesir/Interpole edilmiş kesir (Doğrusal) | İnterpole edilmiş kesir (Hızla/Yavaşla) |
---|---|---|
0 | 0 | 0 |
200 | 0,2 | 0,1 |
400 | 0,4 | 0,345 |
600 | 0,6 | 0,8 |
800 | 0,8 | 0,9 |
1000 | 1 | 1 |
Tabloda gösterildiği gibi, LinearInterpolator
, değerleri değiştirir.
ile aynı hızda, geçen her 200 ms için ,2. AccelerateDecelerateInterpolator
, değerleri LinearInterpolator
değerinden daha hızlı 200 ms ile 600 ms arasında ve 600 ms arasında daha yavaş değiştirir.
1.000 ms.
Animasyon karelerini belirleme
Keyframe
nesnesi, aşağıdakileri tanımlamanızı sağlayan bir zaman/değer çiftinden oluşur:
bir animasyonun belirli bir zamanındaki belirli bir durumu ifade eder. Her animasyon karesinin kendi animasyon karesi de olabilir
animasyonun önceki aralıktaki aralıkta davranışını kontrol etmek için arapolatör
bu animasyon karesinin zamanını ve zamanını değiştirebilirsiniz.
Bir Keyframe
nesnesini örneklendirmek için fabrikadan birini kullanmanız gerekir.
yöntemleri, ofInt()
, ofFloat()
veya ofObject()
yöntemini kullanarak uygun Keyframe
türünü elde edin. Ardından
ofKeyframe()
fabrika yöntemini kullanarak
PropertyValuesHolder
nesnesini edinin. Nesneyi aldıktan sonra
PropertyValuesHolder
nesnesini ileterek bir animatör elde edin ve
hareket ettirir. Aşağıdaki kod snippet'i bunun nasıl yapılacağını gösterir:
Kotlin
val kf0 = Keyframe.ofFloat(0f, 0f) val kf1 = Keyframe.ofFloat(.5f, 360f) val kf2 = Keyframe.ofFloat(1f, 0f) val pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2) ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation).apply { duration = 5000 }
Java
Keyframe kf0 = Keyframe.ofFloat(0f, 0f); Keyframe kf1 = Keyframe.ofFloat(.5f, 360f); Keyframe kf2 = Keyframe.ofFloat(1f, 0f); PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2); ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation); rotationAnim.setDuration(5000);
Görünümleri canlandır
Mülk animasyon sistemi, View nesnelerinin ve tekliflerinin kolaylaştırılmış animasyonunu sağlar görünüm animasyon sistemine göre bazı avantajlara sahiptir. Görünüm animasyon sistemi, nesneleri çizilme biçimini değiştirerek View nesnelerini dönüştürdü. Bu görünümün değiştirilebilecek herhangi bir özelliği olmadığından, her bir Görünümün kapsayıcısında işlenebilir. Bu durum, Görünüm canlandırmasına neden olmuş ancak Görünüm nesnesinde herhangi bir değişikliğe neden olmamıştır. Bu Bu durum, bir nesnenin orijinal konumunda hâlâ var olmasına rağmen hâlâ bulunduğu gibi bir davranışa yol açmıştır. ekranda farklı bir yere çizilmiş olabilir. Android 3.0’da, yeni özellikler ve karşılık gelen bu dezavantajı ortadan kaldırmak için alıcı ve belirleyici yöntemler eklenmiştir.
Mülk animasyon sistemi
Görünüm nesnelerindeki gerçek özellikleri değiştirerek ekrandaki Görünümleri canlandırabilir. İçinde
Ayrıca, Görünümler invalidate()
öğesini de otomatik olarak
yöntemini kullanmanızı öneririz. View
sınıfında, özellik animasyonlarını kolaylaştıran yeni özellikler şunlardır:
translationX
vetranslationY
: Bu özellikler, Görünüm, düzenine göre belirlenen sol ve üst koordinatlarından bir delta olarak yer alır emin olun.rotation
,rotationX
verotationY
: Bu özellikler dönüşü 2D (rotation
özelliği) ve pivot noktası çevresinde 3D olarak kontrol edin.scaleX
vescaleY
: Bu özellikler bir öğenin 2D ölçeklendirmesini Pivot noktasının çevresini görüntüleyin.pivotX
vepivotY
: Bu özellikler, etrafında döndürme ve ölçeklendirme dönüşümlerinin gerçekleştiği pivot noktası. Varsayılan olarak, pivot noktası nesnenin ortasında bulunur.x
vey
: Bunlar, sol ve üst değerlerin toplamı olarak, görünümün kapsayıcısındaki son konumu TranslationX ve TranslationY değerlerini de kullanabilirsiniz.alpha
: Görünümde alfa şeffaflığını gösterir. Bu değer 1'dir (opak) varsayılan olarak 0 değeri tam şeffaflığı temsil eder (görünmez).
Bir Görünüm nesnesinin rengi veya döndürme değeri gibi bir özelliğine animasyon eklemek için bir özellik animatörü oluşturup istediğiniz Görünüm özelliğini animasyon içerir. Örnek:
Kotlin
ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f)
Java
ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
Animatörler oluşturma hakkında daha fazla bilgi için ValueAnimator ve ObjectAnimator.
ViewPropertyAnimator kullanarak animasyon uygulama
ViewPropertyAnimator
, çeşitli animasyonlar için basit bir yol sağlar
tek bir temel Animator
kullanarak paralel olarak View
özellikleri
nesnesini tanımlayın. ObjectAnimator
gibi davranır çünkü
görünüm özelliklerinin gerçek değerlerine bakar ancak aynı zamanda birçok mülk için animasyon
bir kez. Ayrıca, ViewPropertyAnimator
kullanımı için gereken kod
daha kısa ve kolay okunur. Aşağıdaki kod snippet'leri, birden fazla reklam öğesi kullanmanın farkları
ObjectAnimator
nesne, tek
ObjectAnimator
ve ViewPropertyAnimator
aynı anda bir görünümün x
ve y
özelliğini canlandırıyor.
Multiple ObjectAnimator nesneleri
Kotlin
val animX = ObjectAnimator.ofFloat(myView, "x", 50f) val animY = ObjectAnimator.ofFloat(myView, "y", 100f) AnimatorSet().apply { playTogether(animX, animY) start() }
Java
ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f); ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(animX, animY); animSetXY.start();
Bir ObjectAnimator
Kotlin
val pvhX = PropertyValuesHolder.ofFloat("x", 50f) val pvhY = PropertyValuesHolder.ofFloat("y", 100f) ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvhY).start()
Java
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f); PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f); ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvhY).start();
ViewPropertyAnimator
Kotlin
myView.animate().x(50f).y(100f)
Java
myView.animate().x(50f).y(100f);
ViewPropertyAnimator
hakkında daha ayrıntılı bilgi için ilgili Android Geliştiricilerine göz atın
blogu
yayın paylaşın.
XML'de animasyonları bildirme
Özellik animasyon sistemi, özellik animasyonlarını yapmak yerine XML ile bildirmenizi sağlar. bunu programatik olarak sağlar. Animasyonlarınızı XML biçiminde tanımlayarak animasyonlarınızı kolayca yeniden kullanabilirsiniz ve animasyon sırasını daha kolay düzenleyebilirsiniz.
Yeni mülk animasyon API'lerini kullanan animasyon dosyalarını,
eski view animasyonlu çerçevesi,
Android 3.1'den itibaren, özellik animasyonlarına ilişkin XML dosyalarını res/animator/
dizinine kaydetmeniz gerekir.
Aşağıdaki özellik animasyonu sınıflarında aşağıdaki XML etiketlerini içerir:
ValueAnimator
-<animator>
ObjectAnimator
-<objectAnimator>
AnimatorSet
-<set>
XML bildiriminizde kullanabileceğiniz özellikleri bulmak için Animasyon kaynaklar bölümüne göz atın. Aşağıdaki örnekte iki nesne animasyonu grubu oynatılır Buna göre, iç içe yerleştirilmiş ilk grup iki nesne animasyonunu birlikte oynatır:
<set android:ordering="sequentially"> <set> <objectAnimator android:propertyName="x" android:duration="500" android:valueTo="400" android:valueType="intType"/> <objectAnimator android:propertyName="y" android:duration="500" android:valueTo="300" android:valueType="intType"/> </set> <objectAnimator android:propertyName="alpha" android:duration="500" android:valueTo="1f"/> </set>
Bu animasyonu çalıştırmak için kodunuzdaki XML kaynaklarını bir AnimatorSet
nesnesine şişirmeniz ve ardından tüm animasyonlar için hedef nesneleri ayarlamanız gerekir.
. setTarget()
çağrısı yapıldığında, kolaylık sağlamak amacıyla AnimatorSet
öğesinin tüm alt öğeleri için tek bir hedef nesne ayarlanır. Aşağıdaki kodda bunun nasıl yapılacağı gösterilmektedir:
Kotlin
(AnimatorInflater.loadAnimator(myContext, R.animator.property_animator) as AnimatorSet).apply { setTarget(myObject) start() }
Java
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.animator.property_animator); set.setTarget(myObject); set.start();
XML'de bir ValueAnimator
öğesini de
aşağıdaki örnekte gösterilmektedir:
<animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueType="floatType" android:valueFrom="0f" android:valueTo="-100f" />
Kodunuzda önceki ValueAnimator
öğesini kullanmak için
bir
AnimatorUpdateListener
,
güncellenmiş animasyon değerini alıp görünümlerinizden birinin bir mülkünde kullanın,
aşağıdaki kodda gösterildiği gibidir:
Kotlin
(AnimatorInflater.loadAnimator(this, R.animator.animator) as ValueAnimator).apply { addUpdateListener { updatedAnimation -> textView.translationX = updatedAnimation.animatedValue as Float } start() }
Java
ValueAnimator xmlAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.animator); xmlAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator updatedAnimation) { float animatedValue = (float)updatedAnimation.getAnimatedValue(); textView.setTranslationX(animatedValue); } }); xmlAnimator.start();
Özellik animasyonlarını tanımlamaya yönelik XML söz dizimi hakkında bilgi için Animasyon kaynaklar bölümüne göz atın.
Kullanıcı arayüzü performansı üzerindeki olası etkiler
Kullanıcı arayüzünü güncelleyen animatörler, her kare için fazladan oluşturma işine neden olur. reklam öğesidir. Bu nedenle, kaynakların yoğun bir şekilde kullanıldığı animasyonlar uygulamanızın performansını olumsuz yönde etkileyebilir.
Kullanıcı arayüzünüzü canlandırmak için gereken çalışma, şu öğenin animasyon aşamasına eklendi: ardışık düzeninize entegre edilir. Animasyonlarınızın tablodaki öğelerin Profil GPU Oluşturma'yı etkinleştirerek ve animasyon aşamasını izlemek istiyorum. Daha fazla bilgi için Profil GPU oluşturma inceleyin.