我正在开发使用Android Studio在Kotlin编写的Android应用程序(Target API 28,min API 22)。
我有一个ConstraintLayout,添加了许多视图。其中有一个简单的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在应用时是否设置了其他属性?
是的,它非常直观。 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
}