在运行时确定 Android 视图的尺寸

141

我正在尝试在Android应用程序中创建视图后对其应用动画。为此,我需要确定当前视图的大小,然后设置一个动画来从当前大小缩放到新的大小。由于视图根据用户输入缩放到不同的大小,因此必须在运行时完成此操作。我的布局是在XML中定义的。

这似乎是一个简单的任务,并且有许多SO问题涉及此问题,但没有解决我的问题,显然。所以我可能漏掉了一些很明显的东西。我通过以下方式获取我的视图句柄:

ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
这个方法可以正常工作,但是调用getWidth()getHeight()getMeasuredWidth()getLayoutParams().width等方法时,它们都返回0。我也尝试了在视图上手动调用measure(),然后调用getMeasuredWidth(),但没有效果。
我已经尝试在活动的onCreate()onPostCreate()中调用这些方法,并在调试器中检查对象。如何在运行时确定此视图的确切尺寸?

1
哦,还有一点我应该注意的是,视图本身绝对不会具有0的宽度/高度。它在屏幕上显示得很好。 - Nik Reiman
你能发布XML布局中的<ImageView ... />标签吗? - fhucho
1
我曾经在Stack Overflow上尝试了很多解决方案,直到我意识到在我的情况下,视图的尺寸与物理屏幕匹配(我的应用程序是“沉浸式”的,视图及其所有父级的宽度和高度都设置为match_parent)。在这种情况下,一个更简单的解决方案甚至可以在View被绘制之前安全地调用(例如,在Activity的onCreate()方法中),只需使用Display.getSize()即可;有关详细信息,请参见https://dev59.com/tYzda4cB1Zd3GeqPiiM1#30929599。我知道这不是@NikReiman所要求的,但我留下一条注释给那些可能能够使用这种更简单方法的人。 - CODE-REaD
14个回答

0
如果您需要在视图绘制后立即知道其尺寸,可以在该视图上调用post()并发送一个Runnable来执行所需的操作。这比ViewTreeObserver和globalLayout更好,因为它会被重复调用而不仅仅是一次性的。此Runnable将只执行一次,您将知道视图的大小。

0
经过研究,对于我的LinearLayout(但也适用于所有视图),我首先使用参数为(0, 0)的measure方法,然后从测量得到的高度或宽度中读取,这样可以正常工作。
llayout.measure(0, 0)// after this call, measured Height or Width is not 0 anymore
mychartView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, llayout.measuredHeight)

-1
在 Kotlin 文件中,相应地进行更改。
 Handler().postDelayed({

           Your Code

        }, 1)

-2

对我来说完美运作:

 protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        CTEditor ctEdit = Element as CTEditor;
        if (ctEdit == null) return;           
        if (e.PropertyName == "Text")
        {
            double xHeight = Element.Height;
            double aHaight = Control.Height;
            double height;                
            Control.Measure(LayoutParams.MatchParent,LayoutParams.WrapContent);
            height = Control.MeasuredHeight;
            height = xHeight / aHaight * height;
            if (Element.HeightRequest != height)
                Element.HeightRequest = height;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接