たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 7570
目次
本題
スプラッシュスクリーンで使うアイコンの作り方 公式
おことわり
環境
必要なソフトをダウンロード
アイコンを描く
書いた
LibreOffice を経由する
AnimatedVectorDrawable を作る Web アプリ
とりあえず時間経過で表示させてみる
アニメーションの時間
アニメーションさせるまで消したい
移動させたい、回転させたい、サイズを変えたい
保存する
AnimatedVectorDrawable で吐き出す
スプラッシュスクリーンを表示する準備をする
ライブラリをいれる
drawable-v31 フォルダを作る
themes.xml を書く
AndroidManifest.xml を編集
MainActivity を開く
できた!!!
Q&A
Android 12 でスプラッシュスクリーンが出ない
おわりに
どうもこんにちは。
花鐘カナデ*グラム Chapter:2 花ノ香澄玲 攻略しました。(前作やってないので本筋あんまり分かってないけど)とにかくかわいかったです!
ハイスペックでいい子すぎる
↑ ここのシナリオすき、表情がころころ変わるのがいい
そういえば最後の最後にあったあの意味深な文章は何だったんだろう、
3と4で回収するのかな(本筋もあんまり進まずに Chapter:2 終わってしまった)、、
Android 12 で入ったこのスプラッシュスクリーン、アニメーション付きのアイコンが使えるのですが、
なぜかそのスプラッシュスクリーンで使えるアニメーション付きアイコン
の作り方が乗ってないので書きます。
こんなの、等倍速
等倍速だと速すぎるので0.5 倍速
(これでもまだ速い気が)
AnimatedVectorDrawable
を作るWebアプリ
を使うだけなのですが。。
結局このAnimated vector drawable
、どうやって作るのが正攻法なのかがわからない、、、多分この方法は効率が悪い気がする、、、
個人的にはスプラッシュスクリーンアンチなのですが(アニメーションするくらいなら早く開けよお気持ち)、
Android 12
から強制的にスプラッシュスクリーン付いてくるので、まあやるならアニメーションさせるか。って。
https://developer.android.com/develop/ui/views/launch/splash-screen#dimensions
多分この方法はとても非効率です。
おそらくどこか省略できる点があるはず。
なまえ | あたい |
---|---|
PC | Windows 10 Pro |
Inkscape | Inkscape 1.1.1 (最新版でいいはず) |
LibreOffice | Version: 7.0.4.2 (最新版でいいはず) |
言語 | Kotlin (多分Java も行ける) |
なぜかInkscape
とLibreOffice Draw
が必要です。ほんとうはどっちかでSVG
を書けばいいはずなのですが、Inkscape
のsvg
、Android Studio
に入れてDrawable
にしてもなんかうまくいかないんですよね。
しかし、Inkscape
で保存したsvg
をLibreOffice Draw
に入れて、別名保存したものをAndroid Studio
に入れるとちゃんと反映される。何故か私の環境だと一回LibreOffice Draw
を経由しないといけない。
なんでかな、バージョン古いからかな。
Inkscape
でもLibreOffice Draw
でも何でもいいのでSVG
を書くアプリを開いてください。
まずSVG(Drawable)
のサイズなのですが、私もよく知らない。ので私が作ってるときに使ってるサイズを貼っておくとこれです。正方形なので、縦横同じです。
Inkscape | 8.73000 mm |
LibreOffice Draw | 0.90 cm |
<svg> の属性 | width="8.73mm" |
Inkscape
だとドキュメントのプロパティ
からサイズを変更できます。これ
次にアイコンのサイズです、SVG(Drawable)
のサイズと何が違うんだって話ですが、アイコン全体が表示されるわけではなく、真ん中を円形にくり抜いた分だけが表示されます。以下のドキュメントの画像がわかりやすいです。
https://developer.android.com/develop/ui/views/launch/splash-screen?#dimensions
アイコンを大きく書くと見切れてしまうし、小さすぎるとなんだか分からない。くり抜かれる範囲がどこか知りたいですよね、見切れちゃうと嫌ですからね。
というわけで試してみました。以下調査結果です。以下の四角形の範囲に収まれば(線踏むのは四隅じゃなければOK)大丈夫そうです。
数値でいうと、Inkscape
の場合は縦横2.115 mm ~ 6.615 mm
の範囲内にアイコンを書けば、丸く切り抜かれても見切れたりしないはずです。
実際に四角形を置いてみるとこう
上記のように、わかりやすく四角形を置きたい場合、Inkscape
の場合は縦横4.500 mm
の四角形を作って、それをページの真ん中に置くことで、その四角形の中なら見切れない、境界線代わりになります。
LibreOffice Draw
でやりたい場合は0.45 cm
の四角形を真ん中に置くと同様にできます。
この四角形の中にアイコンを書いていきましょう。
あらかじめ時間によって表示したい(出し分けたい)図形はSVG
上に存在させておく必要があります。多分。
いや、SVG
のパスの変形が出来るっぽいんだけど難しそうで使ったことがない。
保存する際は補助線としていた四角い図形を消しましょうね(まあこの後でも消せるけどここで消しちゃうで良い気がする)。
Inkscape
で書いたSVG
を保存したら、今度はLibreOffice Draw
で開きます。
で、開いたら何もせずエクスポートを選び、SVG
として保存します。一応別名保存のがいいでしょう。
なぜかこのLibreOffice Draw
でエクスポートする工程をスキップするとうまくVectorDrawable
に変換できません、、、
また、このとき作ったSVG
、Android 11
以下はスプラッシュスクリーンにAnimatedVectorDrawable
が使えないので代わりにこれを使います。
こちらです。ありざいす!!!
開いたらさっき別名保存したSVG
をインポートしましょう、ここです。ドラッグアンドドロップでもいいかもしれません。
というか私はこれしか使ったこと無いです。
適当なpath
を選んで、ストップウォッチのアイコンを押して、strokeAlpha
を選びます。
次にfromValue
を0
にしておきます。
これで再生ボタンを押すと、、、?
時間経過でfromt
からto
にalpha
が変化します!
私が作ってきたスプラッシュスクリーンのアニメーションはこれの組み合わせがほとんどです、、
ドキュメントによるとスプラッシュスクリーンのアニメーション最大秒数は1000ms
だそうですが、
せいぜいスプラッシュスクリーンのアニメーションは500ms
ぐらいだと思います。
サーバー等の通信等でスプラッシュスクリーンを意図的に長く表示させる場合(ドキュメントにあるViewTreeObserver.OnPreDrawListener
を使う方法)を除き、500ms
ぐらいが限界な気がする。あんまり長いとアニメーションの終了より先にActivity
が起動しちゃう。
また、これはAnimatedVectorDrawable
の話ではなく、スプラッシュスクリーン都合の話だと思いますが、
0ms
から200ms
の間にアニメーションで変化させても認知できないです。(200ms
より前のアニメーションが何だったのか分からない)
アニメーションさせる場合は200ms
から500ms
に収めると良い気がします。
線(stroke
)の場合はstrokeAlpha
、塗りつぶし(fill
)の場合はfillAlpha
を0
にしておくと、strokeAlpha
のアニメーションまでは消しておくことが出来ます。
アニメーション経過後はそのままアニメーションで変化した状態のが適用されます(手元で試している限り)
translateX
のようなものはありませんね。
これはpath
だからで、group
を作り、その中にpath
を入れることでtranslateX
やrotate
が使えるようになります。
というわけでgroup
を作りますか、ここのNew group layer
です。
動かしたい図形たちをgroup
の中に入れて、、、
あとはお好きなものを。
移動させたいならtranslate
、回転ならrotate
、サイズ変更ならscale
です。
shapeshifter
のwebアプリ
で開けるように保存しましょう。
ここのSave
を押すと、.shapeshifter
でプロジェクトを保存できます。これを他の人に渡せば、他の人が開いたshapeshifter
で続きの作業ができるわけです。
もしF5
でリロードしたとしてもこのファイルで保存しておけば良いわけです。
それとは別にスプラッシュスクリーン用にAnimatedVectorDrawable
が必要なので吐き出します。
これです。
Android 12
未満向けに、サポートライブラリがあります。
サポートライブラリ無しで直接Android 12
以降で追加されたAPI
を叩いても良いのですが、古い端末では利用できないので入れます。入れることでAndroid 6
から最新までが一回の実装だけで済みます。
と言ってもドキュメント通りにライブラリを入れるだけです、
https://developer.android.com/develop/ui/views/launch/splash-screen/migrate
ついにデフォルトでGradle Version Catalog
になりましたね、
単一モジュールでバージョンカタログ使ってもあれかと思ったのですが、マルチモジュールにしやすくするためかなって。
drawable
にアニメーションアイコンを格納するのですが、先述の通りアニメーションアイコンはAndroid 12(API 31)
以降だけで、それ以前には動かないアイコンを置く必要があります。
バージョンによって分けるためにv31
を作った感じです。
後はそのフォルダにdrawble
を入れます。名前は合わせましょうね。
スプラッシュスクリーン用のテーマを書きます。
Jetpack Compose
が主流の今、styles
とかthemes
とか書かなくなったなあって。いい時代になりましたね。
View
時代のMaterial Components ライブラリ
なんてテーマがすごく複雑で、一箇所変えたいだけなのに大変だった記憶が、、、あれ使いこなせた人いるのかな、調べてもわけわかめ。
てか結局styles.xml
とthemes.xml
の違いが分からなかった。
背景色(windowSplashScreenBackground
)ですが、色をcolors.xml
に書いて@color/
で参照するべきです。ダークモードに対応できないので。
最初に起動するActivity
のandroid:theme
を、android:theme="@style/Theme.App.Starting"
になるように直します。
最初に起動するActivity
を開きます。たいていMainActivity
だとは思いますが。
installSplashScreen()
というKotlin
拡張関数があるので、それを呼び出します。super.onCreate
よりも前に。拡張関数がないJava
だとSplashScreen.installSplashScreen
が使えるらしいです。
ホーム画面のアイコンを押さないと表示されません。それ以外のルートで起動したら出ません。
(例:Android Studio
の実行ボタン)
差分貼っておきます。
https://github.com/takusan23/KomaDroid/commit/97ce9aeb45631426bf99f5f884f7fa5f5d4c0eb5
また、今回使ったShapeShifter
のファイルも置いておきます。
https://github.com/takusan23/KomaDroid/blob/master/komadroid_splash_icon.shapeshifter
素材集
https://github.com/takusan23/AndroidSplashScreenDesignTemplate
以上でつ、お疲れ様でした88888