gpt4 book ai didi

android - 是什么触发了 View 的 measure() 被调用

转载 作者:IT王子 更新时间:2023-10-28 23:54:28 60 4
gpt4 key购买 nike

在我的应用程序中,我的 View 的 onMeasure() 覆盖之一有一个无限循环。从我的 onMeasure 中的断点开始调试源代码,我能够一直跟踪自己一直到堆栈跟踪到 PhoneWindow$DecorView 的 measure()(我的 View 层次结构中最顶层的类),它由 ViewRoot 调用.performTraversals()。现在从这里开始,如果我继续前行,我最终会通过 Looper.loop() 类中的消息再次调用 PhoneWindow$DecorView 的 measure()。我猜有些东西排队了一条需要重新测量的消息,比如无效。

我的问题是,需要在 View 上进行度量调用的触发因素是什么?

根据我对布局/测量/绘制过程的理解,这只会在特定 View 上调用 invalidate() 方法时发生,并且会向下渗透并为该 View 执行布局/测量/绘制 channel 无效及其所有的 child 。我会假设我的 View 层次结构中最顶层的 View 正在失效。

但是,我已经明确地在我拥有的每个 invalidate 调用上设置了一个断点,并且没有以某种无限的方式调用 invalidate。所以我认为情况并非如此。是否有另一种方法来触发测量通过?内部可能会触发这种情况吗?看到没有什么是无限无效的,我有点想不通。

最佳答案

为了触发自定义 View 的测量传递,您必须调用 requestLayout() 方法。例如,如果您正在实现一个扩展 View 的自定义 View ,并且它的行为类似于 TextView,您可以编写这样的 setText 方法:

/**
* Sets the string value of the view.
* @param text the string to write
*/
public void setText(String text) {
this.text = text;

//calculates the new text width
textWidth = mTextPaint.measureText(text);

//force re-calculating the layout dimension and the redraw of the view
requestLayout();
invalidate();
}

关于android - 是什么触发了 View 的 measure() 被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946478/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com