回答
判断控件上下顺序的方法
在 Hamibot 中,可以通过以下几种方式判断控件的上下顺序:
方法一:通过 bounds() 比较坐标
获取控件的屏幕范围,通过比较 top 值来判断上下位置:
// 文档地址 https://docs.hamibot.com/
var w1 = text('控件 1').findOne();
var w2 = text('控件 2').findOne();
if (w1 != null && w2 != null) {
var b1 = w1.bounds();
var b2 = w2.bounds();
// 比较 top 值,top 值小的在上方
if (b1.top < b2.top) {
toast('控件 1 在控件 2 上方');
} else {
toast('控件 1 在控件 2 下方');
}
// 输出坐标范围
log('控件 1 范围:' + b1);
log('控件 2 范围:' + b2);
}
方法二:通过 drawingOrder() 获取绘制顺序
适用于 Android 7.0 及以上版本:
// 文档地址 https://docs.hamibot.com/
var w1 = text('控件 1').findOne();
var w2 = text('控件 2').findOne();
if (w1 != null && w2 != null) {
var order1 = w1.drawingOrder();
var order2 = w2.drawingOrder();
log('控件 1 绘制顺序:' + order1);
log('控件 2 绘制顺序:' + order2);
// drawingOrder 值小的通常先绘制(在上方或前方)
if (order1 < order2) {
toast('控件 1 绘制顺序在前');
}
}
方法三:通过 indexInParent 获取在父控件中的位置
// 文档地址 https://docs.hamibot.com/
var w1 = text('控件 1').findOne();
var w2 = text('控件 2').findOne();
if (w1 != null) {
var index1 = w1.indexInParent();
log('控件 1 在父控件中的索引:' + index1);
}
if (w2 != null) {
var index2 = w2.indexInParent();
log('控件 2 在父控件中的索引:' + index2);
}
方法四:查找同一父控件下的所有子控件并排序
// 文档地址 https://docs.hamibot.com/
// 找到父控件
var parent = className('android.widget.LinearLayout').findOne();
if (parent != null) {
// 获取所有子控件
var children = parent.children();
// 按 top 坐标排序
for (var i = 0; i < children.size(); i++) {
var child = children.get(i);
var bounds = child.bounds();
log('子控件 ' + i + ' 的 top 坐标:' + bounds.top);
}
}
常用属性参考
| 属性 | 说明 | 适用场景 |
|---|---|---|
| bounds().top | 控件上边缘与屏幕顶部的距离 | 最准确,适用于所有场景 |
| bounds().bottom | 控件下边缘与屏幕顶部的距离 | 判断控件底部位置 |
| drawingOrder() | 控件在父视图中的绘制顺序 | Android 7.0+,同层级控件 |
| indexInParent | 控件在父控件中的索引位置 | 同一父控件下的子控件 |
| depth | 控件的布局深度 | 判断控件层级深度 |
注意事项
- bounds() 方法最可靠:通过比较 top 坐标值是最准确的上下判断方式
- drawingOrder() 限制:仅在 Android 7.0 及以上版本有效,7.0 以下返回 0
- 同一父控件:indexInParent 和 drawingOrder 更适合比较同一父控件下的子控件
- 控件可见性:确保控件 visibleToUser 为 true,否则可能获取不到正确坐标
根据实际场景选择合适的方法,推荐优先使用 bounds() 比较坐标来判断上下顺序。
ℹ️ 本回答由 AI 生成,内容仅供参考