如何处理ImageView的setImageResource与setImageDrawable的差异



所以在尝试将我的图像适当地拉伸到宽度之后,我意识到我真正的问题是setImageResource的行为不同于setImageDrawable(我正在尝试使用)。下面的XML给了我完美的宽度,宽高比与setImageResource拉伸图像,但与setImageDrawable图像不拉伸到宽度,任何建议,我应该如何处理这个问题?我使用setImageDrawable,因为我从互联网上获得的图像替代品是受欢迎的:)

        <ImageView
            android:id="@+id/item_image"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"/>

哦,我试过scaletype,一个给出最好的结果是centercrop,但它的作物是不理想的

这个问题确实是陈腐的,但如果有人遇到它,这个问题并不完全是一个bug,而是在18之前版本的Android中一个糟糕的实现决策。如果你的目标是18岁以上,你可能不会看到这个问题。然而,我目前的目标是企业拥有的平板电脑16。

解决方案是创建一个超类的ImageView覆盖onMeasure来强制宽高比:

class MyImageView extends ImageView {
    public MyImageView(Context context) {
        super(context);
    }
    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        float iwidth  = (float) View.MeasureSpec.getSize(widthMeasureSpec);
        float swidth  = (float) getDrawable().getIntrinsicWidth();
        float sheight = (float) getDrawable().getIntrinsicHeight();
        float iheight = sheight / swidth * iwidth;
        setMeasuredDimension((int)iwidth, (int)iheight);
    }
}

在你的布局中:

<com.mypackage.MyImageView layout_width="match_parent" etc... />

如果你的目标是Android 18+,则adjustViewBounds应该按预期工作

您只需更改xml ImageView
android: layout_width = "宽和"
android: layout_hight = "宽和"

我发现的一个修复方法是使用位图作为setImageBitmap显然类似于setImageResource。我仍然愿意接受其他建议。

你的图像视图的宽度是fill_parent,所以如果你的图像的宽度不够,那么它将被拉伸。如果你不想使用fill_parent,只需替换width "wrap_content"。

<ImageView
        android:id="@+id/item_image"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"/>

最新更新