LinearLayout 内に ImageView がいくつかあります。LinearLayout 内に垂直方向に収まるように、ImageView を縮小してアスペクト比を維持する必要があります。水平方向には、ImageView が互いに隣接している必要があります。
私はこれのために、重み付けされたレイアウトをネストして、ImageViews の幅は広いがあまり高くない LinearLayout を作成する、簡略化されたテストベッドを作成しました。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="5">
<LinearLayout android:id="@+id/linearLayout3" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
<ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
<ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout4" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>
(Eclipse レイアウト エディターでは、画像は垂直方向に切り取られ、まったく拡大縮小されませんが、これは私たちが愛するようになった特異性の 1 つにすぎません)
ハードウェアで実行すると、画像はアスペクト比を維持しながら正しい高さに拡大縮小されます。問題は、画像が隣り合っていないことです。各 ImageView の高さは、LinearLayout の高さと正確に一致しています。各 ImageView の幅は、拡大縮小されていない画像の幅です。実際の縮小された画像は、ImageView の左側に表示されます。このため、画像間に大きな隙間ができてしまいます。
理想的には、これを XML 経由で管理したいのですが、それが不可能な場合は、カスタム ビューを使用するのが最善の解決策になる可能性があると理解しています。
高さに応じて幅を拡大縮小して必要なサイズのイメージ ビューを作成できるように、onMeasure をオーバーライドする IconView (ImageView を拡張) クラスを作成しようとしました。ただし、関数に渡される parentWidth と parentHeight は画面の寸法であり、LinearLayout コンテナーの寸法ではありませんでした。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
// Calculations followed by calls to setMeasuredDimension, setLayoutParams
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
私の質問は -
1) 必要なことを実行するには、何らかの方法で XML を修正できますか?
2) カスタム クラスで LinearLayout の高さを取得し、カスタム イメージに必要な幅を計算できるようにするにはどうすればよいでしょうか?
ここまで読んでくださった方、ありがとうございます。解決策を教えていただけると、さらにありがたいです!
ベストアンサー1
使用するように ImageViews を変更するのはどうでしょうかandroid:layout_height="fill_parent"
?
編集- 見つけるのに少し時間がかかりましたが、ソースを見ると正確に特定できましたビュー境界を調整するandroid:adjustViewBounds="true"
. ImageViews に追加してみるといいかもしれません。驚いたことに、これはデフォルトで false になっています。