アイコンボタンには、ユーザーが実行できるアクションが表示されます。アイコンボタンには、意味が明確なアイコンを使用する必要があります。通常、一般的なアクションや頻繁に使用されるアクションを表します。
アイコンボタンには次の 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)は、ブール値(初期値はfalse)を保持するMutableStateオブジェクトを作成します。これにより、isToggledが状態ホルダーになります。つまり、値が変更されるたびに Compose が UI を再コンポーズします。rememberSaveableを使用すると、画面の回転などの構成変更後もisToggledの状態が保持されます。
IconButtonのonClickラムダは、クリックされたときのボタンの動作を定義し、状態をtrueとfalseの間で切り替えます。Iconコンポーザブルのpainterパラメータは、isToggledの状態に基づいて異なるpainterResourceを条件付きで読み込みます。これにより、アイコンの外観が変更されます。isToggledがtrueの場合、塗りつぶされたハートの描画可能オブジェクトが読み込まれます。isToggledがfalseの場合、ハートの輪郭付き描画可能オブジェクトが読み込まれます。
IconのcontentDescriptionも、isToggledの状態に基づいて更新され、適切なユーザー補助情報を提供します。
結果
次の画像は、前のスニペットの切り替えアイコンボタンが選択されていない状態を示しています。
高度な例: 押すたびに繰り返し実行されるアクション
このセクションでは、ユーザーがアイコンボタンを長押ししている間、1 回のクリックで 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は、ボタンが押されていないときのアイコンのドローアブル リソース ID であるunselectedImage: Intと、ボタンが押されたときのアイコンのドローアブル リソース ID であるselectedImage: Intを受け取ります。interactionSourceを使用して、ユーザーからの「タップ」操作を具体的にトラッキングします。isPressedは、ボタンがアクティブに押されている場合は true、それ以外の場合は false です。isPressedがtrueの場合、LaunchedEffectはループに入ります。- このループ内で、
delay(stepDelayを使用)を使用して、トリガー アクション間の一時停止を作成します。coerceInは、無限ループを防ぐために遅延が 1 ms 以上であることを確認します。 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インスタンスとTextコンポーザブルを含むRowを表示し、カウンタをインクリメントおよびデクリメントするための UI を構築します。rememberとmutableIntStateOfを使用してpressedCount可変状態変数を保持し、0 に初期化します。pressedCountが変更されると、それを監視しているコンポーザブル(Textコンポーザブルなど)は、新しい値を反映するように再コンポーズされます。- 最初の
MomentaryIconButtonは、クリックまたは長押しするとpressedCountを減らします。 - 2 番目の
MomentaryIconButtonは、クリックまたは長押しするとpressedCountを増やします。 - どちらのボタンも 100 ミリ秒の
stepDelayを使用します。つまり、ボタンが押されている間、onClickアクションが 100 ミリ秒ごとに繰り返されます。
結果
次の動画は、アイコンボタンとカウンタを含む UI を示しています。