1

MotionEvent とレイアウトが異なる場所の値を示しているようで、その理由がわかりません。次のようにイメージを定義します。

<ImageView
    android:id="@+id/pic"
    android:layout_width="17dp"
    android:layout_height="17dp"
    android:layout_marginLeft="72dp"
    android:layout_marginTop="72dp"
    android:src="@drawable/pic" />

これにより、密度が2.0であるため、テストしているエミュレーターのピクセル単位で(144、144)に画像が配置されます。ピクセルの位置は log.v で確認され、画像の親は単にレイアウトです。

onTouchListener があり、MotionEvent でタッチの位置を確認します。

Log.v("pixelsX", String.valueOf(event.getX()));
Log.v("pixelsY", String.valueOf(event.getY()));

XML で設定した画像の上と左側をクリックすると、160 以上の値が表示されますが、これは明らかに間違っています。クリックが画像のかなり前にある場合でも、これは 80+ の DP 位置に対応します。

クリック位置 image.setX(event.getX()) (setX/setY および params を使用して試行) に画像を追加しようとすると、画像はクリックの右下に約 40 ピクセル配置されます。画像に余分なパディングなどはありません。さまざまな画像を使用してみましたが、それらの間で一貫しています。画像の親は常にレイアウトであり、レイアウトは ontouchlistener に接続されています。

RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_mine);
layout.setOnTouchListener(touch);

だから、なぜこの位置の違いがあるのか​​ わかりません。

4

2 に答える 2

1

私は問題を理解しました。アクティビティのパディングを作成したときに、RelativeLayout の xml に配置されたため、画像の位置がパディングによってずれていました。

于 2013-05-29T14:34:24.360 に答える
0

ここでこのチャートを確認してください。このサイトから取得しました。画面サイズごとにデバイスが異なる場合があります。このチャートと比較して数値を確認してください

xlarge screens are at least 960dp x 720dp
large screens are at least 640dp x 480dp
normal screens are at least 470dp x 320dp
small screens are at least 426dp x 320dp
Generalised Dpi values for screens:

ldpi Resources for low-density (ldpi) screens (~120dpi)
mdpi Resources for medium-density (mdpi) screens (~160dpi). (This is     the baseline     density.)
hdpi Resources for high-density (hdpi) screens (~240dpi).
xhdpi Resources for extra high-density (xhdpi) screens (~320dpi).
Therefore generalised size of your resources (assuming they are full    screen):

ldpi
Vertical = 426 * 120 / 160 = 319.5px
Horizontal = 320 * 120 / 160 = 240px
mdpi
Vertical = 470 * 160 / 160 = 470px
Horizontal = 320 * 160 / 160 = 320px
hdpi
Vertical = 640 * 240 / 160 = 960px
Horizontal = 480 * 240 / 160 = 720px
xhdpi
Vertical = 960 * 320 / 160 = 1920px
Horizontal = 720 * 320 / 160 = 1440px

px = dp*dpi/160

これは、便利になる場合に備えて、dpからピクセルへの方法です

public static int dpToPixels(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
于 2013-05-29T04:25:32.563 に答える