尽管设置了尺寸,ConstraintLayout 中的自定义视图最终尺寸为 0
Despite setting dimensions, custom view in ConstraintLayout ends up with size 0
我有一个自定义视图 class (EmptyTableView
),它通常工作正常。然而,在我将此视图置于 ConstraintLayout
中心的程序中的某个时刻,该视图突然变得不可见。进一步调查显示,视图定位在 (0, 0)
,大小为 (0 x 0)
。
我的 onMeasure()
里面的 measureSpecs
是 EXACTLY 0
。我不知道那是什么意思,但 someone 说当你弄乱测量模式时会发生这种情况,尽管我不知道为什么会发生这种情况。
这是源代码。
在我的应用程序中,我有一个名为 root 的 ConstraintLayout
视图,它的位置可以通过 DragAndDrop
程序更改。
我的计划是让视图对所有 4 个边都有约束,同时通过约束的偏差来控制位置。当我开始拖动视图时,左右约束被删除,位置由 setX()
和 setY()
控制。这是用这种方法完成的(Kotlin):
fun ConstraintSet.prepareConstraintsForDrag(table: View) {
clear(table.id)
connect(table.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, table.left)
connect(table.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, table.top)
}
然后,当我结束 DragAndDrop
时,我从拖放回调中调用以下代码,以便将视图布局移动到 x 和 y,然后调用 restoreBiases() 连接所有 4 个双方再次:
DragEvent.ACTION_DRAG_ENDED -> {
shadowTouchPoint = null // Just an intern indicator for the drag
val draggedView = event.localState as View
with(draggedView) {
visibility = View.VISIBLE
rootConstraints.clone(root)
setMargin(id, ConstraintSet.START, x.toInt())
setMargin(id, ConstraintSet.TOP, y.toInt())
rootConstraints.applyTo(root)
translationX = 0f
translationY = 0f
}
rootConstraints.clone(root)
rootConstraints.restoreBiases(draggedView, options_guide, root.height.toFloat())
rootConstraints.applyTo(root)
}
restoreBiases():
fun ConstraintSet.restoreBiases(table: View, sideGuide: Guideline, height: Float) {
val xBias = table.x / (sideGuide.left - table.width).toFloat()
val yBias = table.y / (height - table.height)
center(table.id, ConstraintSet.PARENT_ID, ConstraintSet.START, 0,
sideGuide.id, ConstraintSet.START, 0, xBias)
center(table.id, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0,
ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0, yBias)
}
完整代码在GitHub。 prepareConstraintsForDrag()
和 prepareBiases()
位于 TableScene.kt
。 tablePlan
目录下tabblePlan/ConstructEmptyTablePlan.kt
和EmptyTableView.kt
中的回调。
这是 activity 内部的大致样子:
升级到 ConstraintLayout
的 1.1.2 版本:
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
我认为 center()
在此版本之前可能存在问题。我认为这不会解决您的问题,但它可能会为找到根本问题扫清道路。换句话说,我认为您会在屏幕上看到不同的东西。
我可以说您的准则 options_guide
不知何故设置为屏幕宽度。也许这是意图,但如果不是,我会研究如何设置和使用该指南。
我有一个自定义视图 class (EmptyTableView
),它通常工作正常。然而,在我将此视图置于 ConstraintLayout
中心的程序中的某个时刻,该视图突然变得不可见。进一步调查显示,视图定位在 (0, 0)
,大小为 (0 x 0)
。
我的 onMeasure()
里面的 measureSpecs
是 EXACTLY 0
。我不知道那是什么意思,但 someone 说当你弄乱测量模式时会发生这种情况,尽管我不知道为什么会发生这种情况。
这是源代码。
在我的应用程序中,我有一个名为 root 的 ConstraintLayout
视图,它的位置可以通过 DragAndDrop
程序更改。
我的计划是让视图对所有 4 个边都有约束,同时通过约束的偏差来控制位置。当我开始拖动视图时,左右约束被删除,位置由 setX()
和 setY()
控制。这是用这种方法完成的(Kotlin):
fun ConstraintSet.prepareConstraintsForDrag(table: View) {
clear(table.id)
connect(table.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, table.left)
connect(table.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, table.top)
}
然后,当我结束 DragAndDrop
时,我从拖放回调中调用以下代码,以便将视图布局移动到 x 和 y,然后调用 restoreBiases() 连接所有 4 个双方再次:
DragEvent.ACTION_DRAG_ENDED -> {
shadowTouchPoint = null // Just an intern indicator for the drag
val draggedView = event.localState as View
with(draggedView) {
visibility = View.VISIBLE
rootConstraints.clone(root)
setMargin(id, ConstraintSet.START, x.toInt())
setMargin(id, ConstraintSet.TOP, y.toInt())
rootConstraints.applyTo(root)
translationX = 0f
translationY = 0f
}
rootConstraints.clone(root)
rootConstraints.restoreBiases(draggedView, options_guide, root.height.toFloat())
rootConstraints.applyTo(root)
}
restoreBiases():
fun ConstraintSet.restoreBiases(table: View, sideGuide: Guideline, height: Float) {
val xBias = table.x / (sideGuide.left - table.width).toFloat()
val yBias = table.y / (height - table.height)
center(table.id, ConstraintSet.PARENT_ID, ConstraintSet.START, 0,
sideGuide.id, ConstraintSet.START, 0, xBias)
center(table.id, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0,
ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0, yBias)
}
完整代码在GitHub。 prepareConstraintsForDrag()
和 prepareBiases()
位于 TableScene.kt
。 tablePlan
目录下tabblePlan/ConstructEmptyTablePlan.kt
和EmptyTableView.kt
中的回调。
这是 activity 内部的大致样子:
升级到 ConstraintLayout
的 1.1.2 版本:
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
我认为 center()
在此版本之前可能存在问题。我认为这不会解决您的问题,但它可能会为找到根本问题扫清道路。换句话说,我认为您会在屏幕上看到不同的东西。
我可以说您的准则 options_guide
不知何故设置为屏幕宽度。也许这是意图,但如果不是,我会研究如何设置和使用该指南。