ちょっと見てみて知らなかったことをメモしておきます!Lite版でしたが楽しかったです!
まだ今日のナイトセッションと明日のコードラボがあるようなので楽しみにしています!!
MDCの内部実装から学ぶ 表現力の高いViewの作り方 / HiroYUKI Seto
MaterialShapeDrawable
backgroundとして使うDrawable
いろんなカスタマイズができる
Shadowのカスタマイズもできるので複雑な形のShadowが表示できる。ただAndroidのShadowより少し濃いShadowになる。
MaterialShapeDrawableがMaterialShapeDrawableStateを持っていて、その中でShapeAppearanceModelが保持される。
ShapeAppearanceModelに形状や辺や角などの設定がある
Drawable
intrinsicWidth / Height
BitmapDrawableでは画像の解像度
VectorDrawableではwidthなどに設定されているもの
これを参考にViewがサイズを決める
Viewの再描画
invalidateではなく、postInvalidateを使うと別のThreadからinvalidateを呼べる。内部的にHandlerが使われるので、遅れる可能性がある。postInvalidateOnAnimationを使うと次のフレームで再描画を呼ぶことができるので、遅れる可能性が少ない。
BottomAppBarのテキストのアニメーション
TextViewではTextSizeを変化させると再レイアウトが走ってしまうため、TextScaleというTransitionを使って、ValueAnimatorでscaleX、scaleYを変化させる。
TextInputLayoutではCanvasを使ってTextの大きさを変える。(こちらは知っていた)
自動生成でさくさく実装するユニットテスト / Nozomi Takuma
https://www.youtube.com/watch?v=lj6IMuRcVHY
https://github.com/tkmnzm/test-gen を使うと
fun test(a: String, b:String) :Boolean {}みたいな関数からgenerateでParameterized testを自動的に生成してくれる!
IntelliJプラグインを作る知見などが語られています。
Night Sessionメモ:
RobolectricがJUnit5で動かないらしい。
あとRuleはextensionに移植する必要がある。
UIテストのパターンとして、Page Object Design Patternというのがあるらしい。
Androidで音声合成(TTS)をフル活用するための知識と実践事例 / maKunugi N/A [JA]
https://www.youtube.com/watch?v=yIbqlAM080s
音声合成 = 読み上げ
音声合成はWaveNetというのがブレイクスルーだった(Googleが2014年に買収)
Android 1.6から音声合成が使える
TextToSpeachのかんたんな使い方をわかりやすく説明してくれていました。
Google CloudのText to Speechを利用するとSSML、音声合成用のマークアップ言語で取得できる。
contentDescriptionにsubmit buttomみたいにすると submit button buttonみたいに言われてしまうので良くない。
KotlinのDelegated Propertiesを活用してAndroidアプリ開発をもっと便利にする / chibatching
https://www.youtube.com/watch?v=G5x1WUMj1gE
lateinitはprimitive型だと使えない。DelagetedPropertyのDelegates.notNull()であれば使えるが、これはJavaコード的にはfinalなフィールドなのでDaggerが使えないので困る。がsetterは使えるので @set:Inject
であればInjectできる。
Delegates#vetoableを使うと代入を受け入れるかどうかを判定して行うことができる。
DelegatedPropertyでは重たい処理は意図せずに使ってしまうので向かない。
provideDelegate operatorでDelegatedPropertyを返すようにすることで、provideDelegateオペレーターを実装しているクラスとは別のクラスでDelegatedPropertyを実装できる。イメージ
val a by B()
class B {
operator provideDelegate(..): DelegatedProperty {
return C()
}
}
class C : DelegatedProperty...