如何在运行时确定Android视图的大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

这似乎是一件容易的事情,显然有很多关于这个问题的SO问题,尽管没有一个解决了我的问题。所以也许我错过了一些明显的东西。我通过以下方式了解我的观点:

ImageView myView = (ImageView)getWindow().findViewById(R.id.MyViewID);

提问于
用户回答回答于

实际上有多种解决方案,具体取决于场景:

  1. 在布局阶段结束后,安全方法将在绘制视图之前工作:

public static void runJustBeforeBeingDrawn(final View view, final Runnable runnable) { final OnPreDrawListener preDrawListener = new OnPreDrawListener() { @Override public boolean onPreDraw() { view.getViewTreeObserver().removeOnPreDrawListener(this); runnable.run(); return true; } }; view.getViewTreeObserver().addOnPreDrawListener(preDrawListener); }

  1. 在某些情况下,手动测量视图的大小就足够了:

view.measure(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); int width=view.getMeasuredWidth(); int height=view.getMeasuredHeight();

  1. 如果你已经扩展了自定义视图,则可以在“onMeasure”方法上获得它的大小,但我认为它只适用于某些情况:

protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final int newHeight= MeasureSpec.getSize(heightMeasureSpec); final int newWidth= MeasureSpec.getSize(widthMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }

用户回答回答于

使用视图上的ViewTreeObserver等待第一个布局。只有在第一个布局将getWidth()/ getHeight()/ getMeasuredWidth()/ getMeasuredHeight()工作:

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
      viewWidth = view.getWidth();
      viewHeight = view.getHeight();
    }
  });
}

扫码关注云+社区