Döşemeler, aşağıdakiler de dahil olmak üzere birkaç farklı animasyon yaklaşımını destekler:
- Tween animasyonları kullanarak kaydırma geçişleri.
- Bir kutuya düzgün şekilde solma ve kayma animasyonları ekleyin.
- Lottie animasyonları.
Silme geçişi gösterme
Bir değerden diğerine sorunsuz geçiş göstermek için aşağıdaki kod snippet'inde gösterildiği gibi bir öğe için tween animasyonlarını etkinleştirebilirsiniz:
private var startValue = 15f private var endValue = 105f private val animationDurationInMillis = 2000L // 2 seconds override fun onTileRequest(requestParams: RequestBuilders.TileRequest): ListenableFuture<Tile> { val circularProgressIndicator = CircularProgressIndicator.Builder() .setProgress( FloatProp.Builder(/* static value */ 0.25f) .setDynamicValue( // Or you can use some other dynamic object, for example // from the platform and then at the end of expression // add animate(). DynamicFloat.animate( startValue, endValue, AnimationSpec.Builder() .setAnimationParameters( AnimationParameters.Builder() .setDurationMillis(animationDurationInMillis) .build() ) .build(), ) ) .build() ) .build() return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline(Timeline.fromLayoutElement(circularProgressIndicator)) .build() ) }
Yay yönünü ayarlama
Döşemeniz bir yay içeriyorsa yay çizgisinin veya metnin, kullanıcının seçtiği dilin varsayılan metin yönünde her zaman büyümesini istemeyebilirsiniz. Yay büyüme yönünü belirtmek için ArcDirection
API'lerini kullanın:
public override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile> { return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( EdgeContentLayout.Builder(deviceParameters) .setResponsiveContentInsetEnabled(true) .setEdgeContent( Arc.Builder() // Arc should always grow clockwise. .setArcDirection(LayoutElementBuilders.ARC_DIRECTION_CLOCKWISE) .addContent( ArcLine.Builder() // Set color, length, thickness, and more. // Arc should always grow clockwise. .setArcDirection( LayoutElementBuilders.ARC_DIRECTION_CLOCKWISE ) .build() ) .build() ) .build() ) ) .build() ) }
Yumuşak bir solma veya kaydırma gösterme
Bir öğenin kutuda göründüğünü veya kaybolduğunu daha net belirtmek ya da bir kutunun değerindeki adım değişikliğini daha belirgin bir şekilde göstermek için kutu animasyonlarınızda solma ve kaydırma efektlerini kullanın.
Bir döşeme düzeni, değeri değişen bir öğe içeriyorsa döşeme, öğenin çıkış animasyonunu gösterir, ardından düzeni günceller ve öğenin giriş animasyonunu gösterir.
Şeffaflaşma geçişleri
Aşağıdaki kod snippet'inde, DefaultContentTransitions
yardımcı yöntemleri kullanılarak nasıl yavaş yavaş görünme ve yavaş yavaş kaybolma geçişleri yapılacağı gösterilmektedir. Özel FadeInTransition
ve FadeOutTransition
nesnelerini tanımlamak için sırasıyla geçiş ayarlayıcı yöntemlerinde setFadeIn()
ve setFadeOut()
yöntemlerini çağırın.
public override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile> { // Assumes that you've defined a custom helper method called // getTileTextToShow(). val tileText = getTileTextToShow() return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, tileText) .setModifiers( Modifiers.Builder() .setContentUpdateAnimation( AnimatedVisibility.Builder() .setEnterTransition(DefaultContentTransitions.fadeIn()) .setExitTransition(DefaultContentTransitions.fadeOut()) .build() ) .build() ) .build() ) ) .build() ) }
Slayt geçişleri
Bu diğer kod snippet'i, DefaultContentTransitions
yardımcı yöntemlerini kullanarak kaydırma ve kaydırarak çıkarma geçişlerinin nasıl yapılacağını gösterir. Geçiş ayarlayıcı yöntemlerinde sırasıyla setSlideIn()
ve setSlideOut()
çağrılarını yaparak özel SlideInTransition
ve SlideOutTransition
nesneleri de tanımlayabilirsiniz.
public override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile> { // Assumes that you've defined a custom helper method called // getTileTextToShow(). val tileText = getTileTextToShow() return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, tileText) .setModifiers( Modifiers.Builder() .setContentUpdateAnimation( AnimatedVisibility.Builder() .setEnterTransition( DefaultContentTransitions.slideIn( ModifiersBuilders.SLIDE_DIRECTION_LEFT_TO_RIGHT ) ) .setExitTransition( DefaultContentTransitions.slideOut( ModifiersBuilders.SLIDE_DIRECTION_LEFT_TO_RIGHT ) ) .build() ) .build() ) .build() ) ) .build() ) }
Dönüşüm gösterme
Bir kutudaki belirli bir öğeye veya alana dikkat çekmek için döndürme, ölçeklendirme ve çevirme gibi çeşitli dönüştürme türleri uygulayabilirsiniz.
Dönüşümlerle ilişkili birçok kayan nokta değeri, bu dönüşümleri canlandırmanıza olanak tanıyan dinamik ifadeleri kabul eder.
Döndürme
Özelleştirilebilir bir pivot noktası etrafında saat yönünde döndürme işlemi yapmak için aşağıdakine benzer bir kod kullanın:
return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, someTileText) .setModifiers( Modifiers.Builder() .setTransformation( ModifiersBuilders.Transformation.Builder() // Set the pivot point 50 dp from the left edge // and 100 dp from the top edge of the screen. .setPivotX(dp(50f)) .setPivotY(dp(100f)) // Rotate the element 45 degrees clockwise. .setRotation(degrees(45f)) .build() ) .build() ) .build() ) ) .build() )
Ölçeklendirme
Bir öğeyi yatay ve dikey ölçeklendirme faktörleriyle büyütmek veya küçültmek için aşağıdakine benzer bir kod kullanın:
return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, someTileText) .setModifiers( Modifiers.Builder() .setTransformation( ModifiersBuilders.Transformation.Builder() // Set the pivot point 50 dp from the left edge // and 100 dp from the top edge of the screen. .setPivotX(dp(50f)) .setPivotY(dp(100f)) // Shrink the element by a scale factor // of 0.5 horizontally and 0.75 vertically. .setScaleX(FloatProp.Builder(0.5f).build()) .setScaleY(FloatProp.Builder(0.75f).build()) .build() ) .build() ) .build() ) ) .build() )
Geometrik çeviri
Bir öğeyi ekranda yatay veya dikey olarak belirli sayıda yoğunluk pikseli (dp) kadar taşımak için aşağıdakine benzer bir kod kullanın:
return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( Text.Builder(this, someTileText) .setModifiers( Modifiers.Builder() .setTransformation( ModifiersBuilders.Transformation.Builder() // Translate (move) the element 60 dp to the right // and 80 dp down. .setTranslationX(dp(60f)) .setTranslationY(dp(80f)) .build() ) .build() ) .build() ) ) .build() )
Lottie animasyonları
Döşemeler, resimlere benzer bir söz dizimi kullanarak Lottie animasyonlarının oynatılmasını destekler:
class LottieAnimation : TileService() { val lottieResourceId = "lottie_animation" override fun onTileRequest(requestParams: RequestBuilders.TileRequest): ListenableFuture<Tile> { val layout = LayoutElementBuilders.Image.Builder() .setWidth(dp(150f)) .setHeight(dp(150f)) .setResourceId(lottieResourceId) .build() return Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline(Timeline.fromLayoutElement(layout)) .build() ) } override fun onTileResourcesRequest( requestParams: ResourcesRequest ): ListenableFuture<Resources> { val lottieImage = ResourceBuilders.ImageResource.Builder() .setAndroidLottieResourceByResId( ResourceBuilders.AndroidLottieResourceByResId.Builder(R.raw.lottie) .setStartTrigger(createOnVisibleTrigger()) .build() ) .build() return Futures.immediateFuture( Resources.Builder() .setVersion(requestParams.version) .addIdToImageMapping(lottieResourceId, lottieImage) .build() ) } }
Unutulmaması gereken birkaç nokta:
- Yalnızca Lottie dosyalarının bir alt kümesi desteklenir. Aşağıdaki doğrulayıcılardan birini kullanarak uyumluluğu kontrol edin:
- Online doğrulayıcı: https://skottie.skia.org/. "Uyumluluk raporu" bölümünde dosyanın "Spesifikasyon Hataları", "Spesifikasyon Uyarıları" (Ortak Özellikler yoksayılır) ve "Düşük Güç Profili Hataları" testlerini geçmesi gerekir.
- Bir Rust doğrulama kitaplığı: https://github.com/google/lottie-tools.
- Lottie oynatma, ana sürümü en az
1
ve alt sürümü en az500
olan karo oluşturucular tarafından desteklenir. Belirli bir animasyon desteklenmiyorsa animasyon görünmez ancak kutunun geri kalanı beklendiği gibi oluşturulur. Gerekirse yedek seçenek (ör. statik resim) sağlayabilirsiniz.
Önemli bilgileri animasyonun ortasında göstermeyin.
Animasyonların devre dışı bırakıldığı çeşitli durumlar vardır:
- Sistemin karo oluşturma özelliği, tüm karolardaki animasyonları devre dışı bırakabilir.
- Bir kutu aynı anda yalnızca 4 öğeyi canlandırabilir. Aynı anda 4'ten fazla öğeyi canlandırmaya çalışırsanız hepsinde animasyon gösterilmez.
Animasyonun devre dışı bırakıldığı durumlarda öğeler statiktir ve animasyonun bitiş değerini gösterir. Bu nedenle, önemli bilgileri göstermek için animasyonun süresi gibi davranışlarına güvenmeyin.