ConstraintSet >>应用于将TextView的Alpha设置为1f

时间:2018-09-11 23:59:42

标签: android kotlin textview constraints alpha

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

我有一个ConstraintLayout,其中添加了许多View。其中有一个简单的TextView。我希望TextView使用0f的Alpha值进行初始化(不可见),然后再通过动画将其值更改为1f以使其可见。我可以制作动画,但是初始Alpha似乎没有任何效果。我最终将问题追溯到ConstraintSet>>applyTo(...)方法。下面的代码片段显示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时还设置其他属性吗?

1 个答案:

答案 0 :(得分:3)

是的,这很直观。 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
}