アイコンボタンは、ユーザーが実行できるアクションを表示します。アイコンボタンには、明確な意味を持つアイコンを使用する必要があります。通常は、一般的または頻繁に使用されるアクションを表します。
アイコンボタンには次の 2 種類があります。
- デフォルト: これらのボタンは、メニューや検索などの他の要素を開くことができます。
- 切り替え: 「お気に入り」や「ブックマーク」など、オンとオフを切り替えることができるバイナリ操作を表すボタンです。
API サーフェス
標準のアイコンボタンを実装するには、IconButton コンポーザブルを使用します。塗りつぶし、塗りつぶし(色調)、アウトラインなど、さまざまなビジュアル スタイルを作成するには、それぞれ FilledIconButton、FilledTonalIconButton、OutlinedIconButton を使用します。
IconButton の主なパラメータは次のとおりです。
onClick: ユーザーがアイコンボタンをタップしたときに実行されるラムダ関数。enabled: ボタンの有効状態を制御するブール値。falseの場合、ボタンはユーザー入力に反応しません。content: ボタン内のコンポーザブル コンテンツ。通常はIcon。
基本的な例: 切り替えアイコンボタン
この例では、切り替えアイコンボタンを実装する方法を示します。切り替えアイコンボタンは、選択されているかどうかに基づいて外観が変わります。
@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." ) } }
コードに関する主なポイント
ToggleIconButtonExampleコンポーザブルは、切り替え可能なIconButtonを定義します。mutableStateOf(false)は、ブール値を保持するMutableStateオブジェクトを作成します。初期値はfalseです。これにより、isToggledが状態ホルダーになり、値が変更されるたびに Compose が UI を再コンポーズします。rememberSaveableを使用すると、画面の回転などの構成変更後もisToggledの状態が維持されます。
IconButtonのonClickラムダは、クリックされたときのボタンの動作を定義し、trueとfalseの間で状態を切り替えます。Iconコンポーザブルのpainterパラメータは、isToggled状態に基づいて、異なるpainterResourceを条件付きで読み込みます。これにより、アイコンの外観が変更されます。isToggledがtrueの場合は、塗りつぶされたハートのドローアブルを読み込みます。isToggledがfalseの場合は、輪郭線付きのハートのドローアブルを読み込みます。
IconのcontentDescriptionも、isToggledの状態に基づいて更新され、適切なユーザー補助情報が提供されます。
結果
次の画像は、前のスニペットの切り替えアイコンボタンが選択されていない状態を示しています。
高度な例: 押したときにアクションを繰り返す
このセクションでは、クリックごとに 1 回だけアクションをトリガーするのではなく、ユーザーが長押ししている間、アクションを継続的にトリガーするアイコンボタンを作成する方法について説明します。
@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, ) } }
コードに関する主なポイント
MomentaryIconButtonは、unselectedImage: Int(ボタンが押されていないときのアイコンのドローアブル リソース ID)とselectedImage: Int(ボタンが押されたときのアイコンのドローアブル リソース ID)を受け取ります。interactionSourceを使用して、ユーザーからの「押す」操作を具体的に追跡します。isPressedは、ボタンが実際に押されている場合は true、それ以外の場合は false です。isPressedがtrueの場合、LaunchedEffectはループに入ります。- このループ内では、
delay(stepDelayを使用)を使用して、アクションのトリガー間に一時停止を作成します。coerceInは、無限ループを防ぐために遅延が 1 ミリ秒以上になるようにします。 pressedListenerは、ループ内の各遅延の後に呼び出されます。これにより、アクションが繰り返されます。
- このループ内では、
pressedListenerはrememberUpdatedStateを使用して、onClickラムダ(実行するアクション)が常に最新のコンポジションから最新の状態になるようにします。Iconは、ボタンが現在押されているかどうかに基づいて、表示される画像を変更します。isPressedが true の場合、selectedImageが表示されます。- それ以外の場合は、
unselectedImageが表示されます。
次に、この MomentaryIconButton を例で使用します。次のスニペットは、カウンタを制御する 2 つのアイコンボタンを示しています。
@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 } ) } }
コードに関する主なポイント
MomentaryIconButtonExampleコンポーザブルは、2 つのMomentaryIconButtonインスタンスを含むRowと、カウンタを増減する UI を構築するTextコンポーザブルを表示します。rememberとmutableIntStateOfを使用してpressedCount可変状態変数を保持し、0 に初期化します。pressedCountが変更されると、それを監視しているコンポーザブル(Textコンポーザブルなど)が再コンポーズされ、新しい値が反映されます。- 最初の
MomentaryIconButtonは、クリックまたは長押しするとpressedCountを減らします。 - 2 つ目の
MomentaryIconButtonは、クリックまたは長押しするとpressedCountを増やします。 - どちらのボタンも
stepDelayが 100 ミリ秒に設定されているため、ボタンを長押ししている間、onClickアクションが 100 ミリ秒ごとに繰り返されます。
結果
次の動画は、アイコンボタンとカウンタを含む UI を示しています。