◆はじめに
Android の custom view にて、自身のサイズ変更を元に自身のサイズが変わる処理を行い、計算をすべて親クラスに丸投げするケースのメモです。
◆ダメな例その1
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
// super.onMeasure() が呼ばれてないので、サイズ計算ができておらず、目的の処理が行えない。
doSomethingWithSizeModification()
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
◆ダメな例その2
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
// super.onMeasure() により、現状のサイズが計算される。
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
// 計算されたサイズを元に View の内部を変更するが、上記の計算と合わない内容になってしまい、表示がおかしくなってしまう。
doSomethingWithSizeModification()
}
◆現状の解決策
なんか美しくないのですが、一度の再計算にて計算結果が安定するケースに限り、対応可能だと思われます。
※無限に連鎖するケースとかそもそも対応できるとは思えないが、、、。
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
// super.onMeasure() により、現状のサイズが計算される。
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
// 計算されたサイズを元に View の内部を変更する。
doSomethingWithSizeModification()
// super.onMeasure() により、サイズを再計算する。
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
◆おわりに
とっても微妙な方法なので、もっといい方法があれば教えてくださいmm