web-dev-qa-db-ja.com

AndroidビューのgetTop()、getLeft()、getX()、getY()、getWidth()、getHeight()メソッド)

ドラッグアンドドロップアプリケーションを書いていて、いくつかのパラメーターのために本当に混乱しました。

理解するのを助けてください。

まず、Viewクラスのドキュメントを読み、以下の説明を得ました。

getX() : The visual x position of this view, in pixels.

getY() : The visual y position of this view, in pixels.

getWidth() : Return the width of the your view.

getHeight() : Return the width of the your view.

getTop() : Top position of this view relative to its parent.

getLeft() : Left position of this view relative to its parent.

公式ドキュメントが完成したら、何があるか見てみましょう。

サークルと呼ばれる元のサイズ_500x500_の画像があります。

enter image description here

そして、これが私のアプリケーションの実際のスクリーンショットです

enter image description here

これがレイアウトのxmlです

_<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:gravity="center">

    <ImageView
        Android:id="@+id/imageView1"
        Android:layout_width="100dp"
        Android:layout_height="100dp"
        Android:src="@drawable/circle" />
</LinearLayout>
_

今私は何を心配しています。地元の人たちを見ていると、次のようなことがわかります。

enter image description here

getX()関数とgetY()関数には問題がありません。画像の開始位置が実際に示されているためです。

ドキュメントに記載されているように、getWidth()およびgetHeightメソッドはビューの幅と高さを返しますが、ウォッチウィンドウはgetWidth()およびgetHeightは300です。これは本当に理解できません。XMLではそれぞれ100 dpを設定しているため、関数はそれらを別の測定値で返し、どのようにdpに変換するのですか。

そして最後に、getTop()getLeftは700と300であり、ドキュメンテーションが言うように、それらは親に対する画像の位置です。しかし、私の親は線形レイアウトではないので、この数値は画面配置の意味で何を意味するのでしょうか?

13
Carmine

これらすべての測定メソッドは、密度ピクセル(px)ではなく、ピクセル(dp)でサイズを返します。変換したい場合は、次の呼び出しで密度を取得できます。

float density = getResources().getDisplayMetrics().density;

次に、取得した値を提供された密度で除算します。次に例を示します。

int widthDp = (int)(img.getWidth() / density);
10
Ivan Skoric

これは、将来の訪問者のための補足的な回答です。

enter image description here

  • Left、Top:親ビューがサブビューをレイアウトする場合、leftは親の左側からサブビューの左側までの距離です。同様に、topは、親の上部からサブビューの上部までの距離です。したがって、getLeft()およびgetTop()は、親ビューを基準としたビューの左上隅の座標を返します(画面上の絶対座標ではありません)。
  • X、Y:通常、getX()およびgetY()は、getLeft()およびgetTop()と同じものを返します。ただし、レイアウト済みのビューを少し移動すると便利な場合があります。これは、setTranslationX()およびsetTranslationY()を使用して行うことができます。これらが設定されている場合、xおよびyleftおよびtopとは異なります。

    _x = left + translationX
    y = top + translationY
    _
  • Width、Height:ビューの幅と高さはgetWidth()getHeight()で確認できます。これは翻訳の影響を受けません。

上記の値はすべてピクセル単位です

6
Suragch

あなたはdpからピクセルを得ることができます

float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics());

ポジショニングの質問現在。 getTopおよびgetLeftは相対値であり、親に基づいています。 ImageViewの親はLinearLayoutだけなので、ImageViewActionBar/ToolBarの真下に効果的に配置できます。

また、円に画像を使用しないでください canvas.drawCircle で簡単に描画できます。

5
Bojan Kseneman