Ekranda bulunan nesnelerin, kullanıcı etkileşimi veya arka planda yapılan işlemler nedeniyle genellikle yeniden konumlandırılması gerekir. Nesnenin konumunu hemen güncellemek yerine (bu da nesnenin bir alandan diğerine yanıp sönmesine neden olur) nesneyi başlangıç konumundan bitiş konumuna taşımak için animasyon kullanın.
Android'in, görünüm nesnelerinizi ekranda yeniden konumlandırmanıza olanak tanıdığı yöntemlerden biri ObjectAnimator kullanmaktır. Nesnenin yerleşmesini istediğiniz bitiş konumunu ve animasyonun süresini siz belirlersiniz. Animasyonun hızlanmasını veya yavaşlamasını kontrol etmek için zaman interpolasyonlarını da kullanabilirsiniz.
ObjectAnimator ile görünüm konumunu değiştirme
ObjectAnimator
API, belirli bir süre içinde bir görünümün özelliklerini değiştirmenin bir yolunu sunar.
Hangi tür özelliği canlandırdığınıza bağlı olarak ObjectAnimator örnekleri oluşturmak için statik yöntemler içerir. Görünümlerinizi ekranda yeniden konumlandırırken translationX ve translationY özelliklerini kullanın.
Aşağıda, görünümü 2 saniyede ekranın solundan 100 piksel uzağa taşıyan bir ObjectAnimator örneği verilmiştir:
Kotlin
ObjectAnimator.ofFloat(view, "translationX", 100f).apply { duration = 2000 start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setDuration(2000); animation.start();
Bu örnekte, çeviri değerlerinin kayan nokta olması gerektiğinden
ObjectAnimator.ofFloat()
yöntemi kullanılmaktadır. İlk parametre, animasyon eklemek istediğiniz görünüm. İkinci parametre, animasyon uyguladığınız özelliktir. Görünümün yatay olarak hareket etmesi gerektiğinden translationX özelliği kullanılır. Son parametre, animasyonun bitiş değeridir. Bu örnekte 100 değeri, ekranın solundan çok sayıda piksel uzaklıkta bir konumu ifade eder.
Bir sonraki yöntem, animasyonun ne kadar sürdüğünü milisaniye cinsinden belirtir. Bu örnekte animasyon 2 saniye (2.000 milisaniye) boyunca çalışır.
Son yöntem, animasyonun çalışmasına neden olur ve bu da görünümün ekrandaki konumunu günceller.
ObjectAnimator kullanımı hakkında daha fazla bilgi için Animate using
ObjectAnimator (ObjectAnimator kullanarak animasyon oluşturma) başlıklı makaleyi inceleyin.
Kavisli hareket ekleme
ObjectAnimator kullanmak kolay olsa da varsayılan olarak görünümü başlangıç ve bitiş noktaları arasındaki düz bir çizgi boyunca yeniden konumlandırır. Materyal
tasarım, ekrandaki nesnelerin uzamsal hareketi ve animasyonun zamanlaması için eğrilerden yararlanır. Kavisli hareket kullanmak, uygulamanıza daha materyal bir görünüm kazandırırken animasyonlarınızı daha ilgi çekici hale getirir.
Kendi yolunuzu belirleyin
ObjectAnimator sınıfında, koordinatları bir yolla birlikte aynı anda iki veya daha fazla özellik kullanarak canlandırmanıza olanak tanıyan oluşturucular bulunur. Örneğin, aşağıdaki animatör, bir görünümün X ve Y özelliklerine animasyon eklemek için Path nesnesini kullanır:
Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true) } val animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path).apply { duration = 2000 start() } } else { // Create animator without using curved path }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true); ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path); animator.setDuration(2000); animator.start(); } else { // Create animator without using curved path }
Yayın animasyonu şu şekilde görünür:
Şekil 1. Eğri bir yol animasyonu.
Interpolator, bir yumuşatma eğrisinin uygulanmasıdır. Yavaşlatma eğrileri kavramı hakkında daha fazla bilgi için Materyal Tasarım belgelerine bakın. Interpolator, animasyondaki belirli değerlerin zamanın bir fonksiyonu olarak nasıl hesaplandığını tanımlar. Sistem, Materyal Tasarım spesifikasyonundaki üç temel eğri için XML kaynakları sağlar:
@interpolator/fast_out_linear_in.xml@interpolator/fast_out_slow_in.xml@interpolator/linear_out_slow_in.xml
PathInterpolator kullanma
PathInterpolator sınıfı, Android 5.0'da (API 21) kullanıma sunulan bir interpolatördür. Bézier eğrisine veya Path nesnesine dayanır. Kolaylaştırma ile ilgili Material Design belgelerindeki Android örneklerinde PathInterpolator kullanılır.
PathInterpolator, farklı türlerdeki Bézier eğrilerine dayalı oluşturuculara sahiptir.
Tüm Bézier eğrilerinin başlangıç ve bitiş noktaları sırasıyla (0,0) ve (1,1) olarak sabitlenir. Diğer oluşturucu bağımsız değişkenleri, oluşturulan Bézier eğrisinin türüne bağlıdır.
Örneğin, ikinci dereceden bir Bézier eğrisi için yalnızca bir kontrol noktasının X ve Y koordinatları gerekir:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.67f, 0.33f) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.67f, 0.33f); } else { myInterpolator = new LinearInterpolator(); }
Bu, hızlı başlayıp sona yaklaştıkça yavaşlayan bir yumuşatma eğrisi oluşturur.
Kübik Bézier oluşturucunun da başlangıç ve bitiş noktaları sabittir ancak iki kontrol noktası gerekir:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f); } else { myInterpolator = new LinearInterpolator(); }
Bu, Materyal Tasarım'ın vurgulanmış yavaşlatma yumuşatma eğrisinin bir uygulamasıdır.
Daha fazla kontrol için eğriyi tanımlamak üzere rastgele bir Path kullanılabilir:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { moveTo(0.0f, 0.0f) cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f) } PathInterpolator(path) } else { LinearInterpolator() }
Java
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.moveTo(0.0f, 0.0f); path.cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f); myInterpolator = new PathInterpolator(path); } else { myInterpolator = new LinearInterpolator(); }
Bu işlev, kübik Bézier örneğiyle aynı yumuşatma eğrisini oluşturur ancak bunun yerine Path kullanır.
Ayrıca, bir yol interpolatörü XML kaynağı olarak da tanımlayabilirsiniz:
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.5"
android:controlY1="0.7"
android:controlX2="0.1f"
android:controlY2="1.0f"/>
Bir PathInterpolator nesnesi oluşturduktan sonra bunu Animator.setInterpolator() yöntemine iletebilirsiniz. Animator, başlatıldığında zamanlamayı veya yol eğrisini belirlemek için interpolatörü kullanır.
Kotlin
val animation = ObjectAnimator.ofFloat(view, "translationX", 100f).apply { interpolator = myInterpolator start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setInterpolator(myInterpolator); animation.start();