ドラッグアンドドロップアプリケーションを書いていて、いくつかのパラメーターのために本当に混乱しました。
理解するのを助けてください。
まず、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
_の画像があります。
そして、これが私のアプリケーションの実際のスクリーンショットです
これがレイアウトの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>
_
今私は何を心配しています。地元の人たちを見ていると、次のようなことがわかります。
getX()
関数とgetY()
関数には問題がありません。画像の開始位置が実際に示されているためです。
ドキュメントに記載されているように、getWidth()
およびgetHeight
メソッドはビューの幅と高さを返しますが、ウォッチウィンドウはgetWidth()
およびgetHeight
は300です。これは本当に理解できません。XMLではそれぞれ100 dpを設定しているため、関数はそれらを別の測定値で返し、どのようにdpに変換するのですか。
そして最後に、getTop()
とgetLeft
は700と300であり、ドキュメンテーションが言うように、それらは親に対する画像の位置です。しかし、私の親は線形レイアウトではないので、この数値は画面配置の意味で何を意味するのでしょうか?
これらすべての測定メソッドは、密度ピクセル(px
)ではなく、ピクセル(dp
)でサイズを返します。変換したい場合は、次の呼び出しで密度を取得できます。
float density = getResources().getDisplayMetrics().density;
次に、取得した値を提供された密度で除算します。次に例を示します。
int widthDp = (int)(img.getWidth() / density);
これは、将来の訪問者のための補足的な回答です。
left
は親の左側からサブビューの左側までの距離です。同様に、top
は、親の上部からサブビューの上部までの距離です。したがって、getLeft()
およびgetTop()
は、親ビューを基準としたビューの左上隅の座標を返します(画面上の絶対座標ではありません)。X、Y:通常、getX()
およびgetY()
は、getLeft()
およびgetTop()
と同じものを返します。ただし、レイアウト済みのビューを少し移動すると便利な場合があります。これは、setTranslationX()
およびsetTranslationY()
を使用して行うことができます。これらが設定されている場合、x
およびy
はleft
およびtop
とは異なります。
_x = left + translationX
y = top + translationY
_
Width、Height:ビューの幅と高さはgetWidth()
とgetHeight()
で確認できます。これは翻訳の影響を受けません。
上記の値はすべてピクセル単位です
あなたは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
だけなので、ImageView
をActionBar
/ToolBar
の真下に効果的に配置できます。
また、円に画像を使用しないでください canvas.drawCircle で簡単に描画できます。