ConstraintLayout
içinde
2.1 sürümünde bu kullanıcılara yardımcı olmak için çeşitli özellikler eklendi
SharedValues
dahil katlanabilir cihazları yönetin
ReactiveGuide
ve MotionLayout
ile gelişmiş animasyon desteği.
Paylaşılan Değerler
ConstraintLayout
uygulamasına çalışma zamanı değerlerini eklemek için yeni bir mekanizma ekledik:
Bunun, tüm sistem genelinde değerler için kullanılması amaçlanmıştır, çünkü tüm
ConstraintLayout
değere erişebilir.
Katlanabilir cihazlar bağlamında bu mekanizmayı kullanarak katlanabilir cihazları ekranın konumu:
Kotlin
ConstraintLayout.getSharedValues().fireNewValue(R.id.fold, fold)
Java
ConstraintLayout.getSharedValues().fireNewValue(R.id.fold, fold);
Özel bir yardımcıda, ortak kullanılan değerlere erişmek için değişiklikler:
Kotlin
val sharedValues: SharedValues = ConstraintLayout.getSharedValues() sharedValues.addListener(mAttributeId, this)
Java
SharedValues sharedValues = ConstraintLayout.getSharedValues(); sharedValues.addListener(mAttributeId, this);
Katlanabilir Denemeler örneğine bakabilirsiniz.
ekranın konumunu nasıl belirleyeceğimizi görmek için
Jetpack WindowManager kitaplığı ve ekle
ConstraintLayout
konumuna taşıyacak.
Kotlin
inner class StateContainer : Consumer<WindowLayoutInfo> { override fun accept(newLayoutInfo: WindowLayoutInfo) { // Add views that represent display features for (displayFeature in newLayoutInfo.displayFeatures) { val foldFeature = displayFeature as? FoldingFeature if (foldFeature != null) { if (foldFeature.isSeparating && foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL ) { // The foldable device is in tabletop mode val fold = foldPosition(motionLayout, foldFeature) ConstraintLayout.getSharedValues().fireNewValue(R.id.fold, fold) } else { ConstraintLayout.getSharedValues().fireNewValue(R.id.fold, 0); } } } } }
Java
class StateContainer implements Consumer<WindowLayoutInfo> { @Override public void accept(WindowLayoutInfo newLayoutInfo) { // Add views that represent display features for (DisplayFeature displayFeature : newLayoutInfo.getDisplayFeatures()) { if (displayFeature instanceof FoldingFeature) { FoldingFeature foldFeature = (FoldingFeature)displayFeature; if (foldFeature.isSeparating() && foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL ) { // The foldable device is in tabletop mode int fold = foldPosition(motionLayout, foldFeature); ConstraintLayout.getSharedValues().fireNewValue(R.id.fold, fold); } else { ConstraintLayout.getSharedValues().fireNewValue(R.id.fold, 0); } } } } }
fireNewValue()
, ilk parametre olarak değeri temsil eden bir kimlik alır ve
ikinci parametre olarak eklenecek değer.
ReactiveGuide
Zorlamak zorunda kalmadan bir düzende SharedValue
özelliğinden yararlanmanın bir yolu
bir kod yazmak için ReactiveGuide
yardımcı olur. Bu, yatay veya dikey bir çizgiyi
SharedValue
arasında bağlantı oluşturuldu.
<androidx.constraintlayout.widget.ReactiveGuide
android:id="@+id/fold"
app:reactiveGuide_valueId="@id/fold"
android:orientation="horizontal" />
Daha sonra, normal bir kılavuzda olduğu gibi kullanılabilir.
Katlanabilir cihazlar için MotionLayout
MotionLayout
2.1 sürümünde içerik biçimine dönüştürmeye yardımcı olan çeşitli özellikler ekledik.
Bu özellik katlanabilir cihazlar için özellikle kullanışlı.
farklı olası düzenler arasında
animasyon işlemi yapmanız gerekir.
Katlanabilir cihazlar için iki yaklaşım mevcuttur:
- Çalışma zamanında mevcut düzeninizi (
ConstraintSet
) güncelleyerek katlayın. - Katlanabilir cihaz durumlarının her biri için ayrı bir
ConstraintSet
kullanın. destek (closed
,folded
veyafully open
).
ConstraintSet
animasyonu
MotionLayout
içindeki updateStateAnimate()
işlevi 2.1
sürüm:
Kotlin
fun updateStateAnimate(stateId: Int, set: ConstraintSet, duration: Int)
Java
void updateStateAnimate(int stateId, ConstraintSet set, int duration);
Bu işlev, belirli bir öğeyi güncellerken değişiklikleri otomatik olarak canlandıracaktır
anında güncelleme yapmak yerine ConstraintSet
updateState(stateId, constraintset)
) tıklayın. Bu şekilde, kullanıcı arayüzünüzü
bağlı olarak değişiklik gösterir.
MotionLayout
içinde ReactiveGuide
ReactiveGuide
,
MotionLayout
:
app:reactiveGuide_animateChange="true|false"
app:reactiveGuide_applyToAllConstraintSets="true|false"
İlki, mevcut ConstraintSet
öğesini değiştirir ve değişikliği canlandırır
otomatik olarak oluşturur. İkincisi, yeni ReactiveGuide
değerini uygular
MotionLayout
içindeki tüm ConstraintSet
'lara konum. Proje yöneticileri
katlanabilir reklamlar için katlama konumunu temsil eden bir ReactiveGuide
kullanılması gerekir.
düzen öğelerinizi ReactiveGuide
göz önünde bulundurarak ayarlıyorsunuz.
Katlanabilir cihaz durumunu temsil etmek için birden fazla ConstraintSet
kullanma
Mevcut MotionLayout
durumunu güncellemek yerine mimariyi yapmanın başka bir yolu
kullanıcı arayüzünüze katlanabilir cihazları desteklemek üzere
özel ayrı eyaletler oluşturmaktır (ör.
closed
, folded
ve fully open
).
Bu senaryoda, bir ReactiveGuide
yönergesini yine de
daha fazla kontrole sahip olursunuz (otomatik dönüşüme kıyasla
mevcut ConstraintSet
) güncellenirken her durumun
olabilir.
Bu yaklaşımla, DeviceState
dinleyicinizde, gelen sesin içeriğini
MotionLayout
MotionLayout.transitionToState(stateId)
yöntemidir.