Android ConstraintLayout Barrier программно не работает - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь получить ConstraintLayout с Barrier, работающим программно.Я использую анко для моего кода.Все работает нормально, но как только я пытаюсь использовать 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-бета1.

1 Ответ

0 голосов
/ 05 июня 2019

barrier в anko не работает, вы должны использовать createBarrier, который можно использовать в applyConstraintSet. Это исправит ваш взгляд на вершину. Но для меня это еще не совсем сработало. Поскольку мой guideline использует verticalBias, это свойство игнорируется при использовании barrier. Что я заметил, так это то, что вместо guideline использование view с высотой 1 работает лучше, а добавление барьера ID в ids.xml также работает лучше, но сейчас я не использую verticalBias и просто вычисляю где вид должен быть. Вот мой код сейчас:

            applyConstraintSet {
                gradientView {
                    connect(ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.BOTTOM of imageView)
                }

                titleTextView {
                    connect(
                        ConstraintSetBuilder.Side.TOP to ConstraintSetBuilder.Side.TOP of imageView,
                        ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.BOTTOM of imageView
                    )
                }

                dateTextView {
                    connect(ConstraintSetBuilder.Side.BOTTOM to ConstraintSetBuilder.Side.TOP of titleTextView margin Dimensions.smallViewPadding)
                }

                subtitleTextView {
                    connect(ConstraintSetBuilder.Side.TOP to ConstraintSetBuilder.Side.BOTTOM of titleTextView margin Dimensions.smallViewPadding)
                }

                textGuideline {
                    connect(
                        ConstraintSetBuilder.Side.TOP to ConstraintSetBuilder.Side.TOP of gradientView margin (gradientHeight.toFloat() * 0.7f).toInt()
                    )
                }

                val barrierId = View.generateViewId()
                createBarrier(barrierId, Barrier.BOTTOM, subtitleTextView.id, textGuideline.id)

                textTextView {
                    connect(ConstraintSetBuilder.Side.TOP to ConstraintSetBuilder.Side.BOTTOM of barrierId margin Dimensions.mediumViewPadding)
                }
            }
...