【发布时间】:2019-05-15 09:06:23
【问题描述】:
我正在尝试让ConstraintLayout 和Barrier 以编程方式工作。我正在使用 anko 作为我的代码。一切正常,但只要我尝试使用Barrier,连接到Barrier 的视图就会设置为视图的顶部,而不是我所说的下方。代码如下:
constraintLayout {
imageView = imageView {
id = View.generateViewId()
backgroundColorResource = R.color.black
scaleType = ImageView.ScaleType.CENTER_CROP
}.lparamsMargin(width = matchParent, height = imageHeight)
val gradientView = view {
id = View.generateViewId()
background = getGradient(Color.TRANSPARENT, Color.BLACK, 0.5f)
}.lparams(width = matchParent, height = gradientHeight) {
bottomToBottom = imageView.id
}
titleTextView = textView {
id = View.generateViewId()
typeface = context.font(R.font.value_regular)
textSize = 40f
textColor = Color.WHITE
gravity = Gravity.CENTER
horizontalPadding = Dimensions.mediumViewPadding
}.lparams(width = matchParent) {
topToTop = imageView.id
bottomToBottom = imageView.id
}
dateTextView = textView {
id = View.generateViewId()
typeface = context.font(R.font.value_regular)
textSize = 21f
textColor = Color.WHITE
gravity = Gravity.CENTER
horizontalPadding = Dimensions.mediumViewPadding
}.lparams(width = matchParent) {
bottomToTop = titleTextView.id
bottomMargin = Dimensions.smallViewPadding
}
subtitleTextView = textView {
id = View.generateViewId()
typeface = context.font(R.font.value_regular)
textSize = 16f
textColorResource = R.color.textColorOffWhite
gravity = Gravity.CENTER
horizontalPadding = Dimensions.mediumViewPadding
}.lparams(width = matchParent) {
topToBottom = titleTextView.id
topMargin = Dimensions.smallViewPadding
}
val textGuideline = guideline {
id = View.generateViewId()
}.lparams(width = matchParent) {
topToTop = gradientView.id
bottomToBottom = gradientView.id
verticalBias = 0.7f
}
val textBarrier = barrier {
id = View.generateViewId()
referencedIds = intArrayOf(subtitleTextView.id, textGuideline.id)
type = Barrier.BOTTOM
}.lparams(width = matchParent, height = wrapContent)
textTextView = textView {
id = View.generateViewId()
typeface = context.font(R.font.value_regular)
textSize = 21f
textColorResource = R.color.textColorOffWhite
lineSpacingMult = 1.38f
gravity = Gravity.CENTER
horizontalPadding = Dimensions.mediumViewPadding
}.lparams(width = matchParent, height = wrapContent) {
topToBottom = textBarrier.id
}
}.lparams(width = matchParent, height = wrapContent)
我正在尝试做的是让文本与图像和渐变重叠,除非标题太大并将文本推低。如果我输入topToBottom = textGuideline.id,它会像预期的那样工作,但如果标题太长,我希望它把文本推低。
我使用的ConstraintLayout 版本是2.0.0-beta1。
【问题讨论】:
-
运气好能解决您的问题吗?我有同样的问题,我认为 Barrier 中的方法
setReferenceIds()并没有多大作用。我们应该调用addId()或setIds()但它们在基类 ConstraintHelper 中是私有的。 -
@JDenais 不完全是,我解决了顶部视图的问题。显然
barrierin anko 不起作用。所以我使用applyConstraintSet并使用这个:createBarrier(barrierId, Barrier.BOTTOM, subtitleTextView.id, textGuideline.id)。现在它是它应该在的地方。但我现在的问题是它不尊重guideline的verticalBias。所以我所知道的是一个视图比guideline效果更好,如果你将barrierId 放在ids.xml 中它也可以更好地工作,但没有设法完全解决verticalBias问题,所以仍在努力。我会为其他人回答这个问题
标签: android android-constraintlayout anko