14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Android】Viewのサイズを動的に変える時、dp指定かpx指定か忘れがち【Layout】

Posted at

はじめに

無限回忘れるから備忘録として残す。

結論

結論から言うと、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>

最後に

アスペクト比計算...。
端末のサイズに合わせて画像サイズを変更...。
うっ...頭痛が...。

おわり。

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?