有没有可能在 ConstraintLayout 中以绝对方式设置视图的坐标?
在 ConstraintLayout 中定位视图应该使用约束,因为 layout_editor_absolutex|y 仅用于设计目的。
但是这里有几种在 ConstraintLayout 中将视图定位到绝对位置的方法:
1. 将视图的 topMargin 和 leftMargin 设置为绝对位置。
val view = findViewById<...>
val params = view.layoutParams as ConstraintLayout.LayoutParams
params.leftMargin = x // absolute x position
params.topMargin = y // absolute y position
view.requestLayout()
- 创建水平和垂直参考线,并将它们的边缘分别设置为y、x绝对位置;然后将视图约束到参考线上。
val view = findViewById<...>
val verticalGL = getGuideline(this, ConstraintLayout.LayoutParams.VERTICAL)
val horizontalGL = getGuideline(this, ConstraintLayout.LayoutParams.HORIZONTAL)
constraintLayout.addView(verticalGL)
constraintLayout.addView(horizontalGL)
verticalGL.setGuidelineBegin(x)
horizontalGL.setGuidelineBegin(y)
val set = ConstraintSet()
set.clone(constraintLayout)
set.connect(view.id, ConstraintSet.START, verticalGL.id, ConstraintSet.START)
set.connect(view.id, ConstraintSet.TOP, horizontalGL.id, ConstraintSet.TOP)
set.applyTo(constraintLayout)
private fun getGuideline(context: Context, orientation: Int): Guideline {
val guideline = Guideline(context)
guideline.id = Guideline.generateViewId()
val lp = ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
)
lp.orientation = orientation
guideline.layoutParams = lp
return guideline
}