在运行时确定Android视图的大小
创建活动后,我试图将动画应用于Android应用程序中的视图。为此,我需要确定视图的当前大小,然后设置动画以从当前大小缩放到新大小。这部分必须在运行时完成,因为视图会根据用户的输入缩放为不同的大小。我的布局以XML定义。
这似乎是一项容易的任务,显然有很多关于此的SO问题,尽管没有一个解决了我的问题。所以也许我缺少明显的东西。我可以通过以下方式理解我的观点:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
这工作得很好,但打电话时getWidth()
,getHeight()
,getMeasuredWidth()
,getLayoutParams().width
,等,他们都返回0。我也试过手动调用measure()视图上,然后到一个呼叫getMeasuredWidth()
,但没有效果。
我试过调用这些方法,并在活动的onCreate()
和中检查调试器中的对象onPostCreate()
。如何在运行时找出该视图的确切尺寸?
-
在视图上使用
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(); } }); }
-
根据@mbaird的建议,我通过对ImageView类进行子类化和重写来找到了可行的解决方案onLayout()。然后,我创建了一个观察器接口,我的活动实现了该观察器接口,并将对自身的引用传递给该类,从而使该类可以告知活动实际何时完成大小调整。
我不是100%确信这是最好的解决方案(因此我还没有将此答案标记为正确的答案),但是它确实有效,并且根据文档,这是人们首次找到视图的实际大小。