【发布时间】:2017-01-25 10:59:37
【问题描述】:
我尝试实现与许多 GUI 构建器类似的行为:如果当前拖动的组件几乎与另一个组件在水平或垂直线上,则它们应该与另一个组件对齐。 我目前的方法是遍历所有放置的组件并检查四个边缘中的任何一个是否(几乎)与拖动组件的边缘对齐:
for (v in rootView.relativeLayout.children()) {
// x
val left = event.rawX - dXInit
val right = event.rawX - dXInit + view.width
val leftEdgeRange = (v.leftEdge() - 50 .. v.leftEdge() + 50)
val rightEdgeRange = (v.rightEdge() - 50 .. v.rightEdge() + 50)
when (left) {
in leftEdgeRange -> x = v.leftEdge()
in rightEdgeRange -> x = v.rightEdge()
}
when (right) {
in leftEdgeRange -> x = v.leftEdge() - view.width
in rightEdgeRange -> x = v.rightEdge() - view.width
}
// y
val top = event.rawY - dYInit
val bottom = event.rawY - dYInit + view.height
val topEdgeRange = (v.topEdge() - 50 .. v.topEdge() + 50)
val bottomEdgeRange = (v.bottomEdge() - 50 .. v.bottomEdge() + 50)
when (top) {
in topEdgeRange -> y = v.topEdge()
in bottomEdgeRange -> y = v.bottomEdge()
}
when (bottom) {
in topEdgeRange -> y = v.topEdge() - view.height
in bottomEdgeRange -> y = v.bottomEdge() - view.height
}
}
与
fun View.topEdge() = y
fun View.bottomEdge() = y + height
fun View.leftEdge() = x
fun View.rightEdge() = x + width
但这似乎效率低下,因为这是在 onTouch 中调用的,所以这个循环经常运行。有更好的方法吗?欢迎提供一般或 Java 答案。
【问题讨论】:
标签: java android user-interface kotlin