0

有没有办法解决这个问题?我试过invalidate()了,但它仍然显示同样的问题。发生的情况是,在打开页面/活动后,图像的行为类似于图 A 中的图像。它仅在来回滚动后呈现到我想要的布局(图 B)。在此处输入图像描述

我要做的是在运行时设置图像的宽度和高度。所以这也与我之前的问题有关:我的 Horizo​​ntalListView 中的图像会随机改变它的大小,而ImageView 动态宽度和高度几乎没有得到帮助。

请问关于这个问题有什么建议吗?

编辑:顺便说一句,我的类是: MyCustomAdapter(扩展 baseadapter,这从 ImageLoader 调用 displayimage())、 MyActivityImageLoader(这是我的图像 url 被加载、解码、异步显示的地方)

我也很困惑我将在哪里设置 imageView 的高度和宽度。现在,我将它设置为 ImageLoader。没关系。但我不知道我是否做对了。

4

1 回答 1

0

如果要在运行时手动设置宽度和高度,请在布局系统测量视图后获取对 ImageView 的 LayoutParams 的引用。如果您在渲染阶段过早执行此操作,您的视图的宽度和高度以及它的父视图等都将为 0。

我在一个开源库中有一些代码可以帮助你。该过程分为两部分:

  1. 为您的控件设置一个附加到 ViewTreeObserver 的 OnPreDrawListener。我的示例在自定义控件中执行此操作,但您也可以在您的活动中执行此操作。
  2. 在 onPreDraw 方法中,您的图像及其父图像现在将分配给它们的宽度和高度值。您可以进行计算,然后手动将宽度和/或高度设置为视图的 LayoutParams 对象(不要忘记将其设置回来)。

查看这个示例,其中我在自定义 ImageView 渲染到屏幕之前将其应用宽高比。我不知道这是否完全适合您的用例,但这将演示如何将 OnPreDrawListener 添加到 ViewTreeObserver,完成后将其删除,并在运行时将动态调整大小应用于 View

https://github.com/aguynamedrich/beacon-utils/blob/master/Library/src/us/beacondigital/utils/RemoteImageView.java#L78

这是一个修改后的版本,它删除了我特定的调整大小逻辑。它还从 imageView 中获取 ViewTreeObserver,如果您没有实现自定义控件并且只想在 Activity 中执行此操作,则更有可能发生这种情况

private void initResizeLogic() {
    final ViewTreeObserver obs = imageView.getViewTreeObserver();
    obs.addOnPreDrawListener(new OnPreDrawListener() {

        public boolean onPreDraw() {
            dynamicResize();
            obs.removeOnPreDrawListener(this);
            return true;
        }
    });
}

protected void dynamicResize() {
        ViewGroup.LayoutParams lp = imageView.getLayoutParams();
        // resize logic goes here...
        // imageView.getWidth() and imageView.getHeight() now return 
        // their initial layout values
        lp.height = someCalculatedHeight;
        lp.width = someCalculatedWidth;
        imageView.setLayoutParams(lp);
    }
}
于 2013-04-04T04:11:25.167 回答