【问题标题】:ConstraintSet>>applyTo Setting the Alpha Of a TextView to 1fConstraintSet>>applyTo 将 TextView 的 Alpha 设置为 1f
【发布时间】:2019-02-16 12:46:12
【问题描述】:

我正在开发一个使用 Android Studio 用 Kotlin 编写的 Android 应用(目标 API 28,最低 API 22)。

我有一个 ConstraintLayout,其中添加了许多视图。其中有一个简单的TextView。我希望 TextView 使用 0f(不可见)的 alpha 进行初始化,然后(通过动画)将其值更改为 1f 以使其可见。我让动画正常工作,但最初的 alpha 似乎没有任何效果。我最终将问题追溯到ConstraintSet>>applyTo(...) 方法。下面的 sn-p 显示 ConstraintSet>>applyTo(...) 将 TextView 的 alpha 设置回 1f,即使我明确将其设置为 0f

val textView = TextView(context)
textView.id = View.generateViewId()
textView.text = "Hello World"
addView(textView)

val set ConstraintSet()
set.constrainHeight(textView.id, WRAP_CONTENT)
set.constrainWidth(textView.id, WRAP_CONTENT)
set.connect(textView.id, TOP, PARENT_ID, TOP)
set.connect(textView.id, START, PARENT_ID, START)
set.connect(textView.id, END, PARENT_ID, END)
set.connect(textView.id, BOTTOM, PARENT_ID, BOTTOM)
println("1. textView=${textView.alpha}")
textView.alpha = 0f
println("2. textView=${textView.alpha}")
set.applyTo(this)
println("3. textView=${textView.alpha}")
textView.alpha = 0f
println("4. textView=${textView.alpha}")

当我运行我的应用程序时,运行窗口中会生成以下输出:

I/System.out: 1. textView=1.0
              2. textView=0.0
              3. textView=1.0
              4. textView=0.0

通过在 ConstraintSet>>applyTo(...) 调用之后设置 TextView 的 alpha,我实现了 0f 的 alpha。

我的问题是……为什么?为什么 ConstraintSet 会更改它所约束的视图的属性(似乎)与约束无关? ConstraintSet 在应用时是否设置了其他属性?

【问题讨论】:

    标签: android kotlin textview constraints alpha


    【解决方案1】:

    是的,这很反直觉。 ConstraintSet 在应用之前创建实际 LayoutParams 的扩展。

    这个扩展是android.support.constraint.Constraints.LayoutParams,此时(从constraint-layout:1.1.3反编译)​​它存储了以下(默认值):

    public static class LayoutParams extends android.support.constraint.ConstraintLayout.LayoutParams {
        public float alpha = 1.0F;
        public boolean applyElevation = false;
        public float elevation = 0.0F;
        public float rotation = 0.0F;
        public float rotationX = 0.0F;
        public float rotationY = 0.0F;
        public float scaleX = 1.0F;
        public float scaleY = 1.0F;
        public float transformPivotX = 0.0F;
        public float transformPivotY = 0.0F;
        public float translationX = 0.0F;
        public float translationY = 0.0F;
        public float translationZ = 0.0F;
    
        //... rest of class
    }
    

    【讨论】:

    • 有没有办法告诉 ConstraintSet 不要使用它自己的 LayoutParams(即使用视图本身的 LayoutParams)?或者是在应用 ConstraintSet 之后才设置 LayoutParams 属性的解决方案。后者使您在制作要预配置这些属性的自定义视图时变得困难。
    • @DavidA 遗憾的是,constraintSet 不是那么灵活...您可以在修改 ConstraintLayout 之前 clone(ConstraintLayout constraintLayout) 当前布局参数 ConstraintSet,这会导致一些开销,但除非您有非常复杂的布局应该是最简单的解决方案。
    • 谢谢。我试试看。
    猜你喜欢
    • 2019-05-18
    • 2020-06-27
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2012-11-08
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多