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

Android 如何处理ImageView setImageResource与setImageDrawable的差异,android,imageview,Android,Imageview,因此,在尝试将图像适当拉伸到宽度的过程中遇到了很多挫折之后,我意识到我真正的问题是setImageResource的行为与setImageDrawable(我正在尝试使用)不同。下面的XML使用setImageResource为我提供了完美的宽度、纵横比拉伸图像,但是使用setImageDrawable,图像没有拉伸到宽度,有什么建议我应该如何处理这个问题吗?我使用setImageDrawable,因为我从互联网上获取图像(欢迎选择:) 哦,我试过scaletype,效果最好的是center

因此,在尝试将图像适当拉伸到宽度的过程中遇到了很多挫折之后,我意识到我真正的问题是setImageResource的行为与setImageDrawable(我正在尝试使用)不同。下面的XML使用setImageResource为我提供了完美的宽度、纵横比拉伸图像,但是使用setImageDrawable,图像没有拉伸到宽度,有什么建议我应该如何处理这个问题吗?我使用setImageDrawable,因为我从互联网上获取图像(欢迎选择:)



哦,我试过scaletype,效果最好的是centercrop,但它会裁剪出不需要的部分。

您只需在xml ImageView中进行更改
android:layout\u width=“fill\u parent”

android:layout\u hight=“fill\u parent”

您只需在xml ImageView中进行更改
android:layout\u width=“fill\u parent”

android:layout\u hight=“fill\u parent”

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

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

您的图像视图的宽度是“填充父视图”,因此如果图像的宽度不够,它将被拉伸。如果您不想使用“填充父视图”,只需替换宽度“包裹内容”


图像视图的宽度为“填充父视图”,因此如果图像的宽度不够,则图像将被拉伸。如果不想使用“填充父视图”,则只需替换宽度“包裹内容”


这个问题已经过时了,但如果有人遇到它,问题不在于有多大的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... />


如果你的目标是安卓18+adjustViewBounds,那么它应该可以正常工作。

这个问题确实过时了,但如果有人遇到它,问题不在于它有多大的缺陷,而在于安卓18之前版本中的错误实现决策。如果你的目标是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应按预期工作。

否不起作用,请重试:)我不知道问题是否与我的imageview位于scrollview中的relativelayout中有关。问题仍然是setImageResource有效,而setImageDrawable无效。否无效重试:)我不知道问题是否与我的imageview位于scrollview中的relativelayout中有关。问题仍然是setImageResource有效,而setImageDrawable无效。我想拉伸它,这是我最头疼的问题。在调用setImageDrawable之前,只需从图像中绘制一个可拉伸的图像并设置其宽度。这可能行得通,但似乎比使用位图要费事,我认为位图将是一种解决方法。我想拉伸它,这是我最头疼的问题。在调用setImageDrawable之前,只需从图像中创建一个drawable并设置其宽度。这可能会起作用,但似乎比使用位图要多,我认为位图将是一条出路。针对Android 22和您的修复程序帮助了我。针对Android 22和您的修复程序帮助了我。