duyojiぶろぐ

技術系ときどき日常系

getLeft(),getRight()で座標取得する

今回はViewの座標をgetRight(),getLeft()で取得しようとした際ちょっとつまずいたことを書こうと思う。でもその前にgetRight(),getLeft()の使う場所でハマる場合も考えられるので簡単にどこでgetLeft(),getRight()を使えばいいか説明する。

座標取得方法

AndroidでButtonやLinearLayoutの座標を取得したい時にgetLeft(),getRightをつかってそのViewの左端、右端の座標を取得しようと思ってもonCreateの中から読んでも値はゼロになる。これはおそらくまだレンダリングが済んでない状態でViewを取得しようとしているから値は得られないのではないかと僕は思う。

その際以下のようにonWindowFocusChangedメソッドの中に書く。

@Override
onWindowFocusChanged(boolean hasFocus){
     super.onWindowFocusChanged(hasFocus);
     View.getLeft();//仮
     View.getRight();//仮
}

このように「onWindowFoocusChanged(boolean hasFocus)」の中に記述すると値がゼロではなくきちんとそのViewの座標を取得してくれる。
このオーバーライドしたonWindowFocusChanged()はレンダリングが終わったあとに読み込まれるメソッドらしくそのためきちんとした値で帰ってくる。


getLeft(),getRight()は親Viewの座標取得

全く見た目が同じ2つのxmlファイルを作ってみる。

<RelativeLayout android:layout_width="fill_parent"
     android:layout_height="wrap_content">
     <Button android:layout_width="wrap_content" android:id="@+id/button" 
             android:layout_height="wrap_content" android:text="button"
             android:layout_alignParentRight="true"/>
</RelativeLayout>
<RelativeLayout android:layout_width="fill_parent"
     android:layout_height="wrap_content">
     <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"
               android:layout_alignParentRight="true">
          <Button android:layout_width="wrap_content" android:id="@+id/button"
                  android:layout_height="wrap_content" android:text="button"/>
     </LinearLayout>
</RelativeLayout>


この二つは同じレイアウトになると思う。(確認してないので確証は持てない。)
この二つの違いはRelativeLayoutの中のButtonの親Viewが異なるところである。一つ目のは親がRelativeLayout,2つ目のは親がLinearLayoutである。この時にidであるbuttonをもとにインスタンスを作り以下のように座標を取得する。

Button button = (Button) findViewById(R.id.button);
button.getLeft();
button.getRight();

この場合getLeft()の方が結果の違いが分かりやすいと思うのでgetLeft()で返ってくる値を見てみると、RelativeLayoutが親の場合0ではない(おそらく200以上の数字が返ってくると思う)。それはRelativeLayoutの開始座標が画面の左上からだから左端から純粋に数値が数えられる。
しかしLinearLayoutが親の場合LinearLayout(親View)の中の左端が基準(0,0)となるので、子ViewのbuttonをgetLeft()しても基準値(0,0)から見た値が返ってくるのでgetLeft()は「0」が返る。