【问题标题】:How to handle ImageView setImageResource difference from setImageDrawable如何处理 ImageView setImageResource 与 setImageDrawable 的差异
【发布时间】:2014-05-30 02:40:07
【问题描述】:

因此,在尝试将我的图像正确拉伸到宽度的大量挫折之后,我意识到我真正的问题是 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,但它的裁剪效果并不理想。

【问题讨论】:

    标签: android imageview


    【解决方案1】:

    这个问题确实过时了,但万一有人遇到它,这个问题并不是一个错误,而是 18 之前的 Android 版本中的错误实施决定。如果你的目标是 18 岁以上,你可能不会看到这个问题。不过,我目前的目标是 16 岁的企业拥有的平板电脑。

    解决方案是创建一个覆盖 onMeasure 的 ImageView 超类来强制执行纵横比:

    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 应该可以正常工作。

    【讨论】:

    • 以 Android 22 为目标,您的修复帮助了我。
    【解决方案2】:

    您只需在 xml ImageView 中进行更改
    android:layout_width="fill_parent"
    android:layout_hight="fill_parent"

    【讨论】:

    • No 不起作用再试一次 :) 我不知道问题是否与我的 imageview 位于滚动视图内的 relativelayout 内有关。问题仍然存在,setImageResource 有效,而 setImageDrawable 无效。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我想把它拉长,这让我很头疼。
      • 在调用 setImageDrawable 之前,只需从图像中创建一个可绘制对象并设置其宽度。
      • 这可能行得通,但似乎比使用位图更有效,我认为位图将是要走的路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2023-04-03
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多