【问题标题】:Android: Is it possible to calculate a view's height before it's drawn?Android:是否可以在绘制视图之前计算它的高度?
【发布时间】:2015-05-10 10:47:34
【问题描述】:

注意事项:

  • 我不想使用任何 getViewTreeObserver() 侦听器,或者根本不想使用任何侦听器。我想计算视图在绘制之前的高度。
  • 我尝试了 getMeasuredHeight(),但每次都返回 0。

有什么建议吗?

【问题讨论】:

  • 第一次尝试View#measure(int widthMeasureSpec, int heightMeasureSpec) ?
  • 先测量视野,再测量高度
  • 好吧,我刚刚尝试过,但我得到了不正确的值...我阅读了 Java 关于度量的解释,但我仍然没有找到一种方法来计算绘制后的正确高度。我想知道为什么人们说这是不可能的。

标签: android android-layout


【解决方案1】:

您必须使用 getViewTreeObserver()。您可以做的一件事是将视图中的可见性设置为可见或不可见(只是为了创建一个高度),然后在代码中将其更改为不可见/消失。示例:

private int mHeight = 0;
private View mView;

class...

// onCreate or onResume or onStart ...
mView = findViewByID(R.id.someID);
mView.getViewTreeObserver().addOnGlobalLayoutListener( 
new OnGlobalLayoutListener(){

    @Override
    public void onGlobalLayout() {
        // gets called after layout has been done but before display
        // so we can get the height then hide the view


        mHeight = mView.getHeight(); 

        mView.getViewTreeObserver().removeGlobalOnLayoutListener( this );
        mView.setVisibility( View.GONE );
    }

});

【讨论】:

  • 别无他法。
【解决方案2】:

其实还有另一种方式,我曾经用它来做一些自定义的东西,但它肯定会为你工作

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
       void run() {
            if(view.getHeight() == 0) {
                 handler.postDelayed(this, 50);
            } else {
                 // you're all set
            }
       }
}, 50);

希望对你有帮助

【讨论】:

  • 这与调用 onGlobalLayoutListener() 完全一样。视图被绘制,然后处理程序返回它的高度。我想在绘制视图之前计算高度。
  • 那你为什么要这样做呢?可能还有另一种解决方法,因为它没有任何意义
  • 我正在尝试为 Gridview 的项目设置自定义高度。将参数设置为 GridView.AUTO_FIT 或类似会导致 UI 中出现混乱的大小变化,因为每个项目都会加载一个图像。我尝试了从设置默认的固定大小图像源到使用 ImageView 的比例类型的所有方法,但都没有奏效。我现在所做的是将固定数字设置为 GridView 的高度。在我的手机中它看起来不错,但在其他手机中并不总是如此。 *哦,是的,我正在使用毕加索。
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2019-08-29
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多