Compose の LottieAnimation でクリックしたときにアニメーションさせる
rememberLottieAnimatable を使います。 @Preview @Composable fun LottieAnimationSample() { val composition by rememberLottieComposition( LottieCompositionSpec.RawRes(R.raw.lottie_animation) ) val...
View ArticleMedia3 の PlayerView で動画再生前の黒い画面の色を変える
setShutterBackgroundColor() を使う PlayerView(context).apply { ... setShutterBackgroundColor(backgroundColor) }
View ArticleCompose Multiplatform で Image loading ってどうやるの?
技術書典14用に書いたんだけど mhidaka 多忙により寝かされてしまったため、ここで供養します。夏コミ(C102)は別の記事を書く予定です。 ========================== 今年(2023年)のKotlinConf(https://kotlinconf.com/)でCompose Multiplatformが発表されました。これまではCompose...
View ArticleActivityResultContracts.CreateDocument に指定する mimeType には * を使ってはいけない
mimeType に "text/*"、ファイル名に "sample.csv"を指定した場合、ファイル名が重複したときの "(1)"が拡張子の後につけられてしまう。 @Composable fun CreateDocumentSample() { val createDocumentLauncher =...
View ArticleInlineTextContent を使って Composable のテキスト中にアイコンを表示する
val id = "inlineContent" val inlineContent = mapOf( Pair( id, InlineTextContent( Placeholder( width = 1.em, height = 1.em, placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline ) ) {...
View ArticleAndroid Studio (IntelliJ IDEA) の Replace の正規表現モードを使う
例えば assertThat(answer).isEqualTo(2) を assertEquals(2, answer) に置き換えたい場合、Replace の正規表現モードを使うことで簡単に変換できる。 Cmd + Shift + R で Replace in Files window を開き、(そのファイルだけ置き換えたいときは Cmd + R)変換元を入力するフィールドの右端の 「.*」...
View ArticleGmail が Intent.selector に反応しない場合がある
手元の Pixel 8 では発生しないのだが、ユーザーさんの moto g13 (motorola penangf)(Android 13(SDK 33)) では、 val intent = Intent(Intent.ACTION_SEND) .putExtra(Intent.EXTRA_EMAIL, arrayOf(address))...
View ArticleWorkManager で android.net.ConnectivityManager$TooManyRequestsException...
WorkManager の Worker の Constraints として val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() val request = OneTimeWorkRequestBuilder<MyWorker>()...
View ArticleKotlinらしいコードを書こう - Convert Java File to Kotlin File のあとにやること
KotlinFest 2024 で話すはずだった講演内容です。 みなさん、こんにちは。あんざいゆきです。Android の Google Developer Expert をしています。よろしくお願いします。 私はいろんなクライアントさんの Android アプリ開発のお手伝いをさせていただいていまして、Java から Kotlin に変換した Pull Request...
View ArticleArrangement.spacedBy()
Arrangement.spacedBy() を使うと、Column や Row の要素間に同じ大きさの余白を設けることができます。 Spacer で余白を実装する場合、上端や下端に余白が入らないように index を使った制御が必要になります。 Column { list.forEachIndexed { index, item -> if (index > 0) {...
View ArticleAutoScrollHorizontalPager を作る
(擬似的に)無限ループしたい タップされているときは自動送りしない private const val PAGE_COUNT = 10_000 private const val INITIAL_PAGE = PAGE_COUNT / 2 private fun Int.floorMod(other: Int): Int = when (other) { 0 -> this else...
View ArticleLazyRow で snap させる
SnapLayoutInfoProvider での snap 位置の指定方法が変わっていた。 左端に snap する場合、以前は SnapLayoutInfoProvider( lazyListState = state, positionInLayout = { layoutSize, itemSize, beforeContentPadding, afterContentPadding,...
View ArticleM3 の LinearProgressIndicator の progress は lambda になっているが、使い方に注意しないと...
M2 の LinearProgressIndicator の progress 引数は Float でしたが、M3 では () -> Float になっています。 androidx.compose.material.LinearProgressIndicator( progress = 0.5f, )...
View ArticleComponent が任意のタイミングで更新される構成になっている Dagger を Hilt に移行する
Hilt が入っていない Dagger のみの構成があります。 @Singleton @Component( modules = [ AppModule::class, ] ) interface AppComponent { fun inject(app: MainActivity) } @Module class AppModule { @Singleton @Provides fun...
View Article骨髄ドナーとして骨髄採取の手術をしました
本記事は mhidaka が建立した Advent Calendar 2024 Vol.1の 9日目です(Vol. 2 はこちら)。 2024年のとある時期にとある病院で骨髄採取の手術をしました(非血縁者間骨髄移植です)(時期とか病院とかをはっきり書いてはいけないのです)。なかなか馴染みのないことだと思うので、時系列で起こったことを紹介します。...
View Article