4

カスタム ImageView、scaleType="centerInside" を含む RelativeLayout があり、ビットマップ (通常は imageView より小さい) を読み込みます。ビットマップが描画された場所の左上の位置を取得するにはどうすればよいですか? ビットマップに対する位置の上に addView を配置できるようにする必要があります。

   RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.scroll_scaled, container, false);
ContentImageView image = (ContentImageView) view.findViewById(R.id.base_page);
Bitmap bm = mInterfaceActivity.getPageImage(mPageNumber);
image.setImageBitmap(bm);`

レイアウト ファイル scrolled_scaled

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
    android:scaleType="centerInside"
    android:id="@+id/base_page"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff00ff00"
    android:contentDescription="@string/product_page"
    android:src="@android:drawable/ic_menu_report_image" >
</ImageView>
</RelativeLayout>
4

4 に答える 4

3

Drawableの境界を使用して自分で計算する必要があります。

ImageView test = (ImageView) findViewById(R.id.base_page);
Rect bounds = test.getDrawable().getBounds();
int x = (test.getWidth() - bounds.right) / 2;
int y = (test.getHeight() - bounds.bottom) / 2;

最初に、画像によって使用されていないビュー内のスペースを計算します。次に、中央に配置されるため、余分なスペースが画像の前後に均等に分散されるため、その長さの半分が に描画されますView

これらの数値はビューの位置に相対的ですが、必要に応じてビュー X と Y を追加できます。

于 2012-09-11T15:41:01.443 に答える
1

更新 2: 指定されていない幅と高さ (wrap_content など) を使用している場合、getX と getY は 0 を返します。代わりにiv.getX()iv.getY()この質問への答えに置き換えます:ルート レイアウトを基準としたビューの座標を取得し、それらの値に画像の境界を追加します。

これを行うには、内部のドローアブルの左上の境界に ImageView の位置を追加します。このようなもの:

ImageView iv = (ImageView)findViewById(R.id.image_view);
Drawable d = iv.getDrawable();
Rect bounds = d.getBounds();
int top = iv.getY() + bounds.top;
int left = iv.getX() + bounds.left;

更新: 拡大縮小された画像の場合、より正確な位置を得るには、上と左の座標に画像スケールを掛ける必要があります。次のようにできます。

Matrix m = iv.getImageMatrix();
float[] values = new float[9];
m.getValues(values);
float scaleX = values[Matrix.MSCALE_X];
float scaleY = values[Matrix.MSCALE_Y];

次に、上にscaleYを掛け、左にscaleXを掛ける必要があります。

于 2012-09-11T14:22:14.863 に答える
0

フィードバックと少しの再試行に基づいて、2つの部分からなるソリューションになりました。

サブビューを作成し、「おおよその」位置で RelativeLayout に追加しましたが、View.INVISIBLE として追加しました。

RelativeLayout ViewGroup をスーパークラス化し、onLayout で子ビューのリストを調べて、拡張されたサイズを RelativeLayout が自己認識できるようになったので、それらを「適切な」場所に配置しました。

不格好に見えますが、うまくいきます。

提案してくれたすべての人に感謝します。私の解決策は、みんなのアドバイスを取り入れることでした。

于 2012-09-13T12:38:20.953 に答える