はじめに
無限回忘れるから備忘録として残す。
結論
結論から言うと、layoutParamsをいじってViewのサイズを動的に変更する時は、pxで指定します。
おまけ
だけだとあまりにも味気ないので、Viewのサイズ変更に使えるコードを紹介。
px⇆dp変換
デザイナーから提供される数値はdpだったりする。
計算してサイズを出す場合はdp/pxどちらかに合わせないといけないから、変換の処理が必要。
// px→dp
fun Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
// dp→px
fun Int.toPx(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()
画面サイズ取得
そもそも動的にサイズを変更したい理由が**「画面サイズに応じてViewを拡縮したいから」**ってこと、多いと思う。
// 幅取得
fun Activity.getWindowWidth(): Int {
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val disp = wm.defaultDisplay
val windowWidth = Point()
disp.getSize(windowWidth)
return windowWidth.x
}
// 高さ取得
fun Activity.getWindowHeight(): Int {
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val disp = wm.defaultDisplay
val windowHeight = Point()
disp.getSize(windowHeight)
return windowHeight.y
}
ちなみに、このやり方で取得できるのは画面のpx数。
dpと計算する場合は前述のtoDp()
を使って変換してあげて。
※個人的には、WindowSize
みたいなdata classをつくってwidthとheightを持たせちゃった方がいい気がしてる。
DataBindingを使ってサイズを指定
layoutParams
をいじるんじゃなくて、binding
にサイズを渡しちゃいたい!ってワガママさん、いるよね。
わかる。そっちのが簡単だからね。
まずはwidthとheightを渡せるBindingAdapterを作る。
ちなみにここで渡すのはpx想定。
@BindingAdapter("width", "height", requireAll = true)
@JvmStatic
fun View.setLayoutParams(width: Int?, height?) {
width ?: return
height ?: return
layoutParams = View.LayoutParams(width, height)
}
あとはBindingAdapterをViewに適用して計算した値をわたすだけ。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="width" type="java.lang.Integer"/>
<variable name="height" type="java.lang.Integer"/>
</data>
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
width="@{width}"
height="@{height}"/>
</layout>
最後に
アスペクト比計算...。
端末のサイズに合わせて画像サイズを変更...。
うっ...頭痛が...。
おわり。