【问题标题】:Set size of ImageView in px at runtime在运行时以 px 为单位设置 ImageView 的大小
【发布时间】:2011-05-29 19:32:51
【问题描述】:

我想将 8 个图像缩略图放在一条水平线上,使用整个可用宽度。
图像是从允许我指定尺寸的网络服务中检索的。
我尝试了以下方法:

int widthPx = container.getWidth();
LinearLayout thumbs = (LinearLayout)curView.findViewById(R.id.thumbs);
    for(int i=0; i<pics.length; i++) {
        ImageView iv = new ImageView(mContextt);

        int thumbSize = widthPx / 8;

        try {
            String url = "http://someurl/" + pics[i] + "&width=" + thumbSize  + "&height=" + thumbSize;
            URL imgUrl = new URL(url);
            Drawable imgD = Drawable.createFromStream(imgUrl.openStream(), "src");
            iv.setImageDrawable(imgD);
        }
        catch (Exception e) {
            Log.e(TAG, "loading image failed");
            e.printStackTrace();
        }

        thumbs.addView(iv);
    }

LinearLayout thumbs 设置了 android:layout_width="fill_parent。这段代码生成的 thumbs 明显小于宽度的 1/8。这是为什么?正确的方法是什么?

更新:
此代码位于片段的 onCreateView 内。虽然我的宽度值是根据根视图计算的并且是正确的,但 thumbs.getWidth() 返回 0,尽管视图之前已膨胀并且宽度也应该为 480,因为设置了 layout_width填充父级。我不确定这是否有问题。

我的假设是否正确,即创建的 ImageViews 的布局默认设置为 wrap_content ?如果没有,如何用Java代码设置?

【问题讨论】:

  • 什么是容器? container.getWidth(); 得到的号码是多少?
  • 这里的容器是一个 FrameLayout,它充当此代码所在片段的根。 getWidth() 正确返回 480,因此单个拇指为 60x60px。这是否与 px / dip 转换有关?
  • 如果你使用thumbs.addView (iv, new LayoutParams(thumbSize, thumbSize);,它的尺寸是否合适?
  • 是的,确实如此。所以我猜 wrap_content 不是默认布局。默认布局是什么? Java中如何改成wrap_content?
  • 我回答了你新问题的最后一部分

标签: android image


【解决方案1】:

添加固定大小的ImageViews,即:

thumbs.addView (iv, new LayoutParams(thumbSize, thumbSize));

回答(部分)cmets中的问题:

ImageView API 说:

负责从图像计算其测量值,以便可以在任何布局管理器中使用它

所以它可能假设 60px 为 160 dpi(我可能错了)。

【讨论】:

  • 这很有趣。我的设备有 240 dpi。这是否意味着它缩小了 60 像素?如果是这样,我可以以某种方式阻止它对动态加载的图像这样做吗?我猜对于本地图像,如果它们在 drawable-hdpi 文件夹中可用,则不会发生。对吗?
  • 使用DisplayMetrics 返回的值。您可以使用它从显示器中获取密度。关于第二个,这就是为什么你将它们分开在不同的文件夹中,对吧?
  • 这是否意味着Android总是将远程图像视为从可绘制(160dpi)文件夹中加载的?在这种情况下,是否建议按照此处的建议手动设置 LayoutParameters 以防止缩放?
【解决方案2】:

我建议使用这个:

widthPx = getWindowManager().getDefaultDisplay().getWidth();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多