Android-图像渲染

时间:2013-04-04 03:56:30

标签: android android-layout android-image

有没有办法解决这个问题?我试过invalidate(),但它仍然显示同样的问题。发生的事情是,在打开页面/ Activity之后,图像的行为类似于图A中的图像。它只是在来回滚动后呈现到我想要的布局(图B)。 enter image description here

我要做的是在运行时设置图像的宽度和高度。所以这也与我以前的问题有关:Images in my HorizontalListView changes it size randomlyImageView dynamic width and height,它们得到了很少的帮助。

有关此事的任何提示,好吗?

编辑:顺便说一句,我的课程是: MyCustomAdapter (扩展baseadapter,它从ImageLoader调用displayimage()),   MyActivity ImageLoader (这是我的图片网址加载,解码,异步显示的地方)

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

1 个答案:

答案 0 :(得分:0)

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

我在开源库中有一些可能对您有帮助的代码。这个过程分为两部分:

  1. 为您的控件设置附加到ViewTreeObserver的OnPreDrawListener。我的示例在自定义控件中执行此操作,但您也可以在活动中执行此操作。
  2. 在onPreDraw方法中,您的图像及其父级现在将为其分配宽度和高度值。您可以进行计算,然后手动将宽度和/或高度设置为视图的LayoutParams对象(不要忘记将其设置回来)。
  3. 查看此示例,我将宽高比应用于自定义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);
        }
    }