java - 了解 getViewTreeObserver
问题描述
首先,让我道歉,但我不知道还能问哪里。
我想了解可以在此处找到的以下代码。
除了getViewTreeObserver
一点,我理解所有这一切:
movingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
yAnimation = createSpringAnimation(movingView,SpringAnimation.Y, movingView.getY(), STIFFNESS, DAMPING_RATIO);
xAnimation = createSpringAnimation(movingView,SpringAnimation.X, movingView.getX(), STIFFNESS, DAMPING_RATIO);
movingView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
为什么我们需要这个位?最后一行,OnGlobalLayoutListener
从中删除movingView
,所以我不明白为什么我们设置它然后删除它。如果我从这个监听器中取出yAnimation
andxAmination
行,然后自己运行它们,代码仍然可以正常工作,但是它不会返回到原来的 X 和 Y。但我不明白为什么上面的代码允许createSpringAnimation
函数接收正确的X 和 Y。
拜托,有人能帮我理解吗?
解决方案
Android 需要时间来布置View
布局中的 s。如果您尝试立即读取 View 的任何参数,通常会得到 0 或框架在设法计算正确值之前使用的任何默认值。由于此操作是异步的,因此您需要注册一个侦听器,以便在布局准备好时收到通知。然后,当然,您可以读取值并删除侦听器,因为不再需要了。不过要小心,因为有时会多次调用侦听器,因此在使用这些值之前和注销侦听器之前,请检查您是否真的设法读取了有意义的值。
推荐阅读
- reactjs - 尝试使用 Tailwind 启动 React 应用程序失败
- pine-script - Pine 脚本 - 动态历史参考
- bash - 列出不遵循特定格式的目录
- sql - SQL || 如何递归查找长文本中的术语,并在前后返回单词 n
- django - DJANGO:如何从同一模板上的 ListView 和 DetailView 访问数据?
- python - value_counts 返回相同值的计数?
- visual-studio-code - 输出显示在终端而不是输出部分。(对比代码)
- angular - 如何根据给定值自定义 LabelConnectors - Kendo UI
- android - Android:跳过了 41 帧!应用程序可能在其主线程上做了太多工作
- encryption - 证书签名请求中手动创建的签名与 openssl req 生成的签名不匹配