Android Basic with ComposeのUnit3で学んだことをまとめてみる: Material Design
はじめに
こんにちは、某SIerでSEをやっているnekorush14です。
この記事は絶賛再*n入門しているAndroid開発について、Google公式のLearning Courseを通して学んだことをアウトプットするシリーズです。
Jetpack Composeに関するCourseのUnit3で得た知見を話します。
前回の記事はこちら👇
今回はUnit 3の後半部分であるMaterial Designについてまとめます。
Material Design
Material Designとは、Googleが提唱するUIデザインのベストプラクティをサポートするガイドライン・コンポーネント・ツールのAdaptiveなシステムのことです。
- 公式ページ: Material Design
Android、Web、Flutter向けに実装が適用されており、ライブラリを使用することにより比較的小さいコストでMaterial Designのガイドラインに従ったアプリを構築できます。
Jetpack ComposeはMaterial Designとの親和性が高く、アプリケーションのテーマとしてMaterial Designを簡単に適用できます。Theme.kt
では、アプリケーションのデザインテーマに関する以下の情報を保持しており、一元管理できます。
- Color
- Typography
- Shape
Theme.kt
で定義するTheme
もComposableであり、Jetpack Compose内のComposableから呼び出すことができます。
Text(
text = stringResource(R.strings.example),
style = TextStyle(
color = MaterialTheme.colorScheme.onPrimary, // Themeで指定したonPrimary色を使用する
)
)
アプリケーションに対するテーマの指定はonCreate
内のsetContent
で行います。
override fun onCreate(savedInstanceState: Bundle?) {
// ...
setContent {
// プロジェクトをExampleという名前で作成した場合のTheme指定 (デフォルト状態)
ExampleTheme {
// ...
}
}
}
上記の例はAndroidのプロジェクトを生成した直後の状態です。
デフォルトで<プロジェクト名>Theme
というComposableがTheme.kt
に定義されており、それを指定しています。
以降はColor、Typography、Shapeについてそれぞれまとめてみます。
また、同時に扱われたAnimationについてもまとめてみます。
Colors
-
Androidのカラースキームは16進かつ、alpha付きのRGBで表される
-
#FF808080
: Alpha:0xFF
, Red:0x80
, Green:0x80
, Blue:0x80
-
-
カラースキームを生成するためにMaterial Theme Builderを使用するとよい
-
PrimaryはUI全体の主要なコンポーネントで使用される
-
SecondaryはUI内部の目立たないコンポーネントで使用される
-
TertiaryはPrimaryとSecondaryのバランスを取ったり、Inputフィールドなどに注意を惹かせるためのアクセントとして使用される
-
on
が付くカラーはon
が付いていないカラーの上に表示する際の色を表す- テキスト、アイコン、ストロークで使用される
-
APIレベル31以降(Android 12以降)であればユーザが設定しているデバイスの壁紙に基づいた配色を適用できる
-
dynamicDarkColorScheme
、dynamicLightColorScheme
を使用する
-
-
Colors.ktに色を指定し、Theme.kt内でカラースキームを生成する
-
material3.darkColorScheme
、material3.lightColorScheme
を使用する
-
-
Themeを適用すると各カラーの役割に応じてThemeで設定した色が各コンポーネントへ自動的に割り当てられる
- コンポーネント内で明示的に色を指定するとオーバーライドできる
-
文字列をstring.xmlで管理するのと同様にディメンション値(dpの値)を
dimens.xml
で管理するとよい- プロダクトコードにハードコードする必要がなく、一元管理できる
- プロダクトコードでマジックナンバーのハードコードを避けられる
- プロダクトコードで参照するには
dimensionResource
を使用する- リソース本体には文字列リソースと同じく
R
クラスを使用する
- リソース本体には文字列リソースと同じく
- プロダクトコードにハードコードする必要がなく、一元管理できる
-
ダークテーマ
- バッテリー使用量の削減や暗い環境でのユーザビリティなどからAndroidにはデバイスをダークテーマに切り替えるオプションがある
- Force Darkをオプトイン可能だが、アプリケーションのテーマで実装より良いUXが得られる
- 独自のダークテーマを作成する場合、ダークテーマの配色がアクセシビリティコントラストの標準を満たす必要がある
- Previewでもダークモードの配色を確認可能
-
Dynamic Color
- Material3はユーザーのパーソナライズに重点を置いている
- Dynamic Colorはユーザーの壁紙に応じてアプリのテーマを作成する
- ブランドカラーが強いアプリケーションやDynamic ColorをサポートしないAndroidに対してカスタムテーマを作成する
- 前述の
material3.darkColorScheme
、material3.lightColorScheme
を使用する方法
- 前述の
Shape
-
RoundedCornerShape
を使用すると適用したコンポーネントの四隅を丸める事ができる- 引数にどのくらいラウンドさせるかを
dp
で指定する - 四隅を個別に指定できる
- Material3の
Shapes
を使用すると大きさ事にShapeを定義できる - Shapeを使用した際にコンテンツが見切れてしまう場合はcontentScaleにCrop属性を付与することでトリミングされ画像が収まるようになる
- contentScaleはmodifierではなくImage Composableの属性
- 引数にどのくらいラウンドさせるかを
- デフォルトのShapeではなく
RoundedCornerShape
などを使いカスタムすることでアプリケーションの見た目がはるかに魅力的となる
Typography
- マテリアルデザインには役割に応じてフォントサイズが用意されている
- タイトル、見出し、タイトル、本文など
- Androidでは様々なフォントが適用されているが、デフォルトで提供されていないフォントを使用することもできる
-
res
にfont
という名称でAndroid Resource Directoryを作成する - 作成したディレクトリにフォントを配置する
- 名称はsnake_caseで記載する
-
FontFamily
を使用することでカスタムフォントファミリーを定義できる- Bold指定をする際は
Font()
の第2引数にFontWeight.Bold
を指定する
- Bold指定をする際は
-
Typography
を使用して役割ごとにTextStyle
を定義できる-
TextStyle
はfontFamily
、fontWeight
、fontSize
などを定義できる
-
-
Animation
-
Jetpack Compose
では様々なアニメーションが用意されている - アニメーションの指定も
Modifier
を使用する- コンテンツのサイズ(例えばリスト要素の高さなど)をアニメーションさせるときは
animateContentSize
を使用する- 実際のサイズはRuntimeで決めることが難しいため、
animationSpec
を指定してどのようにアニメーションさせるかを宣言する
- 実際のサイズはRuntimeで決めることが難しいため、
- 例えば
spring
アニメーションを使用すると、バネの伸縮をもしたアニメーションを適用できる-
spring
アニメーションではdampingRatio
とstiffness
により動きを定義できる
-
- コンテンツのサイズ(例えばリスト要素の高さなど)をアニメーションさせるときは
-
animate*AsState
は指定した値に向かって現在の値からアニメーションさせることができる-
*
にはFloat, Color, Dp, Size, Offset, Int
などの汎用的な型がある -
animateValueAsState
はそれ以外のデータ型をサポートする// expandedはコンポーネントが展開されているかどうかを示すフラグ val color by animateColorAsState( targetValue = if (expanded) MaterialTheme.colorScheme.tertiaryContainer else MaterialTheme.colorScheme.primaryContainer )
-
まとめ
今回はUnit3で扱われたMaterial Designについてまとめました。
Androidでは簡単にMaterial Designを適用でき、最小のコストで洗練されたデザインを適用可能であると感じました。
次回はUnit4になります。
Unit4はいよいよArchitectureとNavigationの話となります。
Discussion