Simge düğmeleri, kullanıcıların yapabileceği işlemleri gösterir. Simge düğmelerinde anlamı net olan bir simge kullanılmalı ve genellikle yaygın veya sık kullanılan işlemler temsil edilmelidir.
İki tür simge düğmesi vardır:
- Varsayılan: Bu düğmeler, menü veya arama gibi diğer öğeleri açabilir.
- Açma/kapatma: Bu düğmeler, "favori" veya "yer işareti" gibi açılıp kapatılabilen ikili işlemleri temsil edebilir.
API yüzeyi
Standart simge düğmeleri uygulamak için IconButton composable'ını kullanın. Dolgulu, dolgulu tonlu veya ana hatlı gibi farklı görsel stiller oluşturmak için sırasıyla FilledIconButton, FilledTonalIconButton ve OutlinedIconButton kullanın.
IconButton için temel parametreler şunlardır:
onClick: Kullanıcı simge düğmesine dokunduğunda yürütülen bir lambda işlevi.enabled: Düğmenin etkinleştirilme durumunu kontrol eden bir boole değeri.falseolduğunda düğme, kullanıcı girişine yanıt vermiyor.content: Düğmenin içindeki birleştirilebilir içerik (genellikleIcon).
Temel örnek: Açma/kapatma simge düğmesi
Bu örnekte, açma/kapatma simgesi düğmesinin nasıl uygulanacağı gösterilmektedir. Açma/kapatma simgesi düğmesi, seçili olup olmamasına göre görünümünü değiştirir.
@Preview @Composable fun ToggleIconButtonExample() { // isToggled initial value should be read from a view model or persistent storage. var isToggled by rememberSaveable { mutableStateOf(false) } IconButton( onClick = { isToggled = !isToggled } ) { Icon( painter = if (isToggled) painterResource(R.drawable.favorite_filled) else painterResource(R.drawable.favorite), contentDescription = if (isToggled) "Selected icon button" else "Unselected icon button." ) } }
Kodla ilgili önemli noktalar
ToggleIconButtonExamplecomposable'ı, açılıp kapatılabilen birIconButtontanımlar.mutableStateOf(false), başlangıçtafalseolan bir boole değeri barındıranMutableStatenesnesi oluşturur. Bu sayedeisToggled, durum bilgisi depolayıcı olur. Yani Compose, değeri her değiştiğinde kullanıcı arayüzünü yeniden oluşturur.rememberSaveable, ekran döndürme gibi yapılandırma değişikliklerindeisToggleddurumunun korunmasını sağlar.
IconButtonöğesininonClicklambda'sı, tıklandığında düğmenin davranışını tanımlayarak durumutrueilefalsearasında değiştirir.Iconcomposable'ınınpainterparametresi,isToggleddurumuna göre koşullu olarak farklı birpainterResourceyükler. Bu işlem, simgenin görsel görünümünü değiştirir.isToggled,trueise içi dolu kalp çizilebilir öğesini yükler.isToggled,falseise içi boş kalp çizimini yükler.
IconöğesinincontentDescriptiondeğeri de uygun erişilebilirlik bilgilerini sağlamak içinisToggleddurumuna göre güncellenir.
Sonuç
Aşağıdaki resimde, önceki snippet'teki açma/kapatma simgesi düğmesinin seçili olmayan durumu gösterilmektedir:
Gelişmiş örnek: Basıldığında tekrarlanan işlemler
Bu bölümde, kullanıcıların yalnızca bir kez tıklamak yerine basılı tutarak sürekli olarak bir işlemi tetikleyen simge düğmelerinin nasıl oluşturulacağı gösterilmektedir.
@Composable fun MomentaryIconButton( unselectedImage: Int, selectedImage: Int, contentDescription: String, modifier: Modifier = Modifier, stepDelay: Long = 100L, // Minimum value is 1L milliseconds. onClick: () -> Unit ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val pressedListener by rememberUpdatedState(onClick) LaunchedEffect(isPressed) { while (isPressed) { delay(stepDelay.coerceIn(1L, Long.MAX_VALUE)) pressedListener() } } IconButton( modifier = modifier, onClick = onClick, interactionSource = interactionSource ) { Icon( painter = if (isPressed) painterResource(id = selectedImage) else painterResource(id = unselectedImage), contentDescription = contentDescription, ) } }
Kodla ilgili önemli noktalar
MomentaryIconButton, düğmeye basılmadığında simgenin drawable kaynak kimliği olanunselectedImage: Intve düğmeye basıldığında simgenin drawable kaynak kimliği olanselectedImage: Intdeğerlerini alır.- Kullanıcının "basma" etkileşimlerini özel olarak izlemek için
interactionSourcekullanır. isPressed, düğmeye basıldığında doğru, aksi takdirde yanlış değerini alır.isPressed,trueolduğundaLaunchedEffectbir döngüye girer.- Bu döngüde, tetikleme işlemleri arasında duraklamalar oluşturmak için
delay(stepDelayile) kullanılır.coerceIn, sonsuz döngüleri önlemek için gecikmenin en az 1 ms olmasını sağlar. pressedListener, döngüdeki her gecikmeden sonra çağrılır. Bu işlem, eylemin tekrarlanmasını sağlar.
- Bu döngüde, tetikleme işlemleri arasında duraklamalar oluşturmak için
pressedListener,onClicklambda'nın (gerçekleştirilecek işlem) her zaman en son oluşturmadan gelen en güncel lambda olmasını sağlamak içinrememberUpdatedStatekullanır.Icon, görüntülenen resmini düğmenin basılı olup olmamasına göre değiştirir.isPresseddoğruysaselectedImagegösterilir.- Aksi takdirde
unselectedImagegösterilir.
Şimdi bu MomentaryIconButton kelimesini örnek cümle içinde kullanın. Aşağıdaki snippet'te, bir sayacı kontrol eden iki simge düğmesi gösterilmektedir:
@Preview() @Composable fun MomentaryIconButtonExample() { var pressedCount by remember { mutableIntStateOf(0) } Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { MomentaryIconButton( unselectedImage = R.drawable.fast_rewind, selectedImage = R.drawable.fast_rewind_filled, stepDelay = 100L, onClick = { pressedCount -= 1 }, contentDescription = "Decrease count button" ) Spacer(modifier = Modifier) Text("advanced by $pressedCount frames") Spacer(modifier = Modifier) MomentaryIconButton( unselectedImage = R.drawable.fast_forward, selectedImage = R.drawable.fast_forward_filled, contentDescription = "Increase count button", stepDelay = 100L, onClick = { pressedCount += 1 } ) } }
Kodla ilgili önemli noktalar
MomentaryIconButtonExamplecomposable'ı, ikiMomentaryIconButtonörneği ve birTextcomposable'ı içeren birRowgöstererek sayacı artırıp azaltmak için bir kullanıcı arayüzü oluşturur.remembervemutableIntStateOfkullanarakpressedCountdeğişken durum değişkenini korur ve 0 olarak başlatılır.pressedCountdeğiştiğinde, bunu gözlemleyen tüm composable'lar (ör.Textcomposable'ı) yeni değeri yansıtacak şekilde yeniden oluşturulur.- İlk
MomentaryIconButton, tıklandığında veya basılı tutulduğundapressedCountdeğerini azaltır. - İkinci
MomentaryIconButton, tıklandığında veya basılı tutulduğundapressedCountartırır. - Her iki düğme de 100 milisaniyelik bir
stepDelaykullanır. Yani düğme basılı tutulurkenonClickişlemi her 100 milisaniyede bir tekrarlanır.
Sonuç
Aşağıdaki videoda, simge düğmeleri ve sayaç içeren kullanıcı arayüzü gösterilmektedir: