如何让我的ImageButton正确调整资产图像的大小?

时间:2013-02-19 07:58:11

标签: android android-layout

我的应用有一个活动,显示一个垂直滚动的ImageButtons列表。我希望每个按钮图像(A)来自资源文件夹,(B)保持它的纵横比,因为它可以缩放。不幸的是,当我的ImageButton图像来自资源文件夹时,它的大小不正确。

从drawable

设置的ImageButton src

第一个截图是我的测试应用程序,其中的图像都来自我的应用程序drawables。这是该图像,“正确的”宽高比这是我要保留的(所有的图像按钮都被赋予scaleType <击>“fitXY” “centerCrop”)。

Images taken from drawables

从资产

设置的ImageButton src

第二个屏幕截图是我的测试应用程序,其中的图像都来自我的应用程序“assets”文件夹 - 如您所见,图像根据需要伸展到屏幕的整个宽度,但原始宽高比已经丢失:

Images taken from 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));
    }
});

摘要

我想从我的应用“assets”文件夹中获取这些按钮的图像。如何修复我的应用程序,以便按钮图像都正确缩放(即保持其原始宽高比)?

我认为这与框架有关,实际上在将ImageButton渲染到屏幕之前并不知道图像的宽度/高度 - 所以我该如何解决?我尝试在RelativeLayout和ImageButton本身上将adjustViewBounds设置为“true”,但这似乎没有任何效果。

2 个答案:

答案 0 :(得分:2)

将比例类型属性指定为“fitXY”时,不保留纵横比。根据您的需要尝试“center”,“center_crop”或“center_inside”。也请检查ImageViewScaleType

答案 1 :(得分:1)

从我收集的内容来看,AdjustViewBounds实际上是提供所需功能的方法。但是,正如Roman Nurik解释here,AdjustViewBounds不会使ViewBounds超出drawable的自然尺寸。

在没有看到你如何分配资源/资产的情况下,我怀疑这就是为什么你从资源加载和从资产加载时看到的差异。您的资源文件 - 可能是 - 在加载时会按比例放大(因为这是资源的默认行为),因此/ res返回的drawable的实际大小明显大于从/ assets中解码的位图。< / p>

覆盖ImageButton(正如Nurik建议的那样),当然是一种选择,但可能有点过分。

假设我对这个问题是正确的,你应该能够通过在加载Assets文件时正确设置BitmapFactory.options来修复它。您需要根据您的设备正确设置inDensity和inTargetDensity(获取DisplayMetrics),并将inScaled设置为true。

或者,您可以在将位图加载到ImageButton之前手动重新缩放位图。只需抓住屏幕宽度即可确定制作它的大小。

P.S。

自动缩放显然是优雅的解决方案,但它确实有一个弱点(同样适用于资源和资产) - 如果您的显示宽度&gt;按比例放大时,你可能仍会将纵横比搞砸了。您可以通过转到横向模式并查看资源文件是否仍然产生正确的宽高比来轻松地检查这一点。如果您有足够大的基本图像(或根据屏幕大小/方向使用不同的布局),那么这应该不是问题。请记住一些事情。