我的应用程序有一个显示图像按钮垂直滚动列表的活动。我希望(A)的每个按钮图像来自资产文件夹,并且(B)在缩放时保留它的纵横比。不幸的是,当图像来自资产文件夹时,我的 ImageButton 大小不正确。
从drawable设置的ImageButton src
第一个屏幕截图是我的测试应用程序,其中所有图像都来自我的应用程序可绘制对象。那是该图像的“正确”纵横比,这是我想要保留的(所有图像按钮都被赋予了 scaleType "fitXY" "centerCrop")。
从资产设置的 ImageButton src
第二个屏幕截图是我的测试应用程序,其中所有图像都来自我的应用程序“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>
狡猾的黑客
我发现了一个狡猾的 hack,它实现了我想要的并说明了问题——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”,但这似乎没有任何效果。