gpt4 book ai didi

Android - 获取 View 的尺寸以定位它

转载 作者:行者123 更新时间:2023-11-30 04:19:07 25 4
gpt4 key购买 nike

我有一个平铺的 pan-n-zoom 组件,它使用多个 FrameLayouts 来定位图像拼贴(缩放)、标记(移动但不缩放)和控件(既不移动也不缩放)。它工作正常。

标记位于具有 topMargin 和 leftMargin 的 FrameLayout 中。到目前为止一切顺利。

当标记被触摸时,我需要打开一个小弹出窗口,在与被触摸的标记相同的位置但偏移弹出窗口的尺寸。也就是说,如果弹出窗口为 100 像素宽和 50 像素高,并且触摸的标记位于 800 x 和 1100 y,则弹出窗口应位于 750 x(标记的位置减去弹出窗口宽度的一半)和 1050 y (标记的位置减去弹出窗口的整个高度)。效果就像一个工具提示 - 一个小块指向标记等。

弹窗尺寸是灵活的,基于要显示的文本,需要计算。

显然,在布局发生之前,尺寸是不可用的。获取这些维度并做出相应 react 的最佳方式是什么?

(应该提到 RelativeLayout 不是一个选项)

TYIA。

/编辑看起来我可以在 onMeasure 和 onLayout 中获取子项的尺寸,但是在这些处理程序中的一个中重新应用新布局会创建一个无限循环 - 设置一个标志以仅捕获第一遍是行不通的。我想更新后的问题是“既然我知道我可以从哪里获得信息,我应该如何 react 和定位它?”

最佳答案

答案是通过覆盖包含 ViewGroup 的 onLayout 而不是 View 本身来管理定位。

例如,

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
MyCustomLayout.LayoutParams lp = (MyCustomLayout.LayoutParams) child.getLayoutParams();
int w = child.getMeasuredWidth();
int h = child.getMeasuredHeight();
int x = lp.left - (int) (w / 2f);
int y = lp.top - h;
child.layout(x, y, x + w, y + h);
}
}
}

(请注意,上面的示例具体未经测试,但我已经测试了前提并且它有效)

关于Android - 获取 View 的尺寸以定位它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531096/

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