私のアプリには、垂直方向にスクロールする ImageButtons のリストを表示するアクティビティがあります。各ボタンの画像を (A) アセット フォルダーから取得し、(B) スケーリングしても縦横比を維持するようにします。残念ながら、イメージがアセット フォルダーから取得された場合、ImageButton のサイズが正しくありません。
ドローアブルから設定された ImageButton src
最初のスクリーンショットは、すべての画像がアプリのドローアブルから取得されるテスト アプリです。それがその画像の「正しい」縦横比であり、これを維持したいのです (すべての画像ボタンには scaleType "fitXY" "centerCrop" が与えられています)。
アセットから設定された ImageButton src
2 番目のスクリーンショットは、すべての画像がアプリの "assets" フォルダーから取得されたテスト アプリです。ご覧のとおり、画像は必要に応じて画面の幅いっぱいに引き伸ばされていますが、元の縦横比は失われています。
アクティビティ コード (MainActivity.java)
LinearLayout buttons = (LinearLayout) findViewById(R.id.buttons);
View button = layoutInflater.inflate(R.layout.snippet_imagebutton, null);
ImageButton imageButton = (ImageButton) button.findViewById(R.id.imageButton);
if (GET_IMAGE_FROM_ASSETS) {
InputStream s = assetManager.open("image.png");
Bitmap bmp = BitmapFactory.decodeStream(s);
imageButton.setImageBitmap(bmp);
} else {
imageButton.setImageResource(R.drawable.image);
}
TextView buttonText = (TextView) button.findViewById(R.id.textView);
buttonText.setText("Button text!");
buttons.addView(button,
new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
ボタンのレイアウト (snippet_imagebutton.xml)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<ImageButton
android:id="@+id/imageButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:gravity="center"
android:textColor="#FFF"
android:background="#88000000"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
危険なハック
私が望むものを実現し、問題を説明する危険なハックを見つけました — ImageButton は、リソースから拡大された画像に一致するように正しくサイズ設定されますが、アセットから拡大された画像に一致するように正しくサイズ変更されません。もしあれば、危険なハックよりも「本物の」ソリューションを好むでしょう。:)
// to start with, scale the ImageButton based on an image in our
// resources that has the same dimensions as the image in our assets
imageButton.setImageResource(R.drawable.image);
// when we eventually render (we don't have width / height yet)...
imageButton.post(new Runnable() {
public void run() {
int height = imageButton.getHeight();
int width = imageButton.getWidth();
// replace our "resource" image with our "asset" image
imageButton.setImageBitmap(bmp);
// and force the ImageButton to keep the same scale as previously
imageButton.setLayoutParams(
new RelativeLayout.LayoutParams(width, height));
}
});
概要
アプリの「資産」フォルダーからこれらのボタンの画像を取得したいと考えています。ボタン画像がすべて適切にスケーリングされるように (つまり、元の縦横比を維持するように) アプリを修正するにはどうすればよいですか?
これは、フレームワークが ImageButton を画面にレンダリングする前に、実際には画像の幅/高さを認識していないことに関係していると思います。どうすれば修正できますか? RelativeLayoutとImageButton自体の両方でadjustViewBoundsを「true」に設定しようとしましたが、効果がないようでした。