Composeでborderの一部分を区切ったようなエフェクトをつける
ComposeでUIを実装するにあたり、borderを角丸の部分だけに描画するという要件が求められた。
ComposeでUIを実装するにあたり、borderを角丸の部分だけに描画するという要件が求められた。
Yumemi社のコーディングチェックをやってみようと思ってやり始めたら、思いの外興が乗ってしまった。
コーディングチェック最初は真面目に取り組もうとしていたのだけど、途中から方針ががらりと変わって自分の学習用の場になってしまった。
始めてから大体1週間位経ったので現在の経過を書いておこうと思う。
最近になってようやくJetpack Composeを触り始めた。
はじめはとっつきにくいなあ、レイアウトはXMLでいいじゃんとか思っていたのだが、慣れてしまえば不思議なものである。レイアウト見るためにいちいちXMLファイル見に行くほうが面倒くさいじゃんと今では感じるようになった。
しかしJetpack Composeでもよくわからないことがある。それがModifierである。
Fragmentでの初期化処理を行う場所どこだっけとなったので備忘録として残しておく。
処理する場所が変わったんだな、ということだけは記憶にあったのだが、結局どこになったのだったかなと迷ってしまった。この先何回も遭遇しそうだったので、ブログに残しておこうと思う。
Fragmentに値を渡す場合は、Bundle経由で渡すのが常識だった。Fragmentはシステムで生成されるため、引数付きのコンストラクタが認識されなかったからだ。
しかし最近ではFragmentFactoryを使うことで、Fragmentに引数付きのコンストラクタを定義しても大丈夫になったということで、今回試してみることにした。
Androidでネットワークアクセスするときにはメインスレッドで実行できないという話を書いた。今回はその続きで、どうやってメインスレッド以外で処理するかという話を書きたい。
Android端末でネットワークリクエストを行う方法について書いてみる。APIを叩く=Retrofitを使うという図式があるのだが、まずその前段階としてOkHttpを使ってネットワークリクエストをしてみようと思う。
Androidでネットワークアクセスする記事ってあんまりないかもって思ったので書いてみることにした。ついでにいうとリハビリを兼ねてというのと、自分でも振り返ってみるとどうやるんだっけってなったのがきっかけである。
久しぶりのAndroid開発である。Droidkaigiのアプリが公開されたので今年もコントリビュートしようと挑戦した。今回はFragmentでバックキーのハンドリングを行うことに挑戦した。
あまりにAndroidネタを書いていないので、たまにはAndroidの話を書こうと思う。
RecyclerViewのアイテムを任意で複数選択し、その選択したアイテムに対して何らかのアクションを実行するのを試してみている。自分のアプリに組み込もうと思ったのだが、いきなり導入するにはAndroid Developersの情報では一体どうしたらいいのかさっぱりわからなかった。
こういうときは専用プロジェクトを作って使い方を試すのが私のやり方。サンプルプロジェクトを作ったのでその話を書こうと思う。
ちなみにこの記事ではコードの話は一切ない。とりあえずそれっぽく動くが、未だに動きに納得できていないし、やっぱり理解しきれていないのが大きい。
Buttonのクリックに反応する範囲を拡張したい時がある。 今回は下図のようなカスタムViewを作りたかった。

ImageButtonとTextViewを内包したViewである。 親レイアウトのViewGroupをタッチする=ImageButtonをタッチするという扱いにしたかった。
ImageButtonにしているのは、他のViewとの兼ね合いである。
他のViewはImageButtonにstyle="@style/Base.Widget.AppCompat.ActionButton"を適用して、アイコン画像の周りにだけリップルエフェクトがかかるようになっていて、このカスタムViewもそれに合わせたかったのである。
これはTouchDelegateを使うと実現できる。
TouchDelegate – Android Developers
TouchDelegateは親のViewGroupに設定する。
TouchDelegateのインスタンスを作成するには、タッチエリアを表すRectと委譲先のView(今回でいうとImageButton)への参照が必要。
Rectはローカル座標系(ディスプレイ上での絶対座標ではなく、ViewGroupの左上を0とした相対座標)を使う。
今回はViewGroupのgetDrawingRect()を使って取得したRectを使った。
ぐぐるとgetHitRect()を使った例がみつかったが、これだとうまく動かなかった。絶対座標になっているからだと思われる。
class CommentStatusView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private lateinit var binding: ViewCommentStatusBinding
init {
binding = ViewCommentStatusBinding.inflate(LayoutInflater.from(context), this, true)
doOnPreDraw {
val rect = Rect()
binding.viewGroup.getDrawingRect(rect)
binding.viewGroup.touchDelegate = TouchDelegate(rect, binding.imageButton)
}
}
override fun setOnClickListener(l: OnClickListener?) {
binding.imageButton.setOnClickListener(l)
}
}
Kotlinで、Android-ktxとDataBindingを使っている。
doOnPreDrawがAndroid-ktxを使っている部分で、ViewTreeObserverを利用してViewの大きさが決まった後で中のブロックの処理(TouchDelegateの設定)を行っているだけである。
後はこのカスタムViewに対するsetOnClicklistenerをImageButtonに対して設定するようにしている。
ポイントは