Android - 获取match_constraint(0dp)视图的高度值?

时间:2018-04-08 19:58:15

标签: android android-layout kotlin android-view android-xml

我正在使用Constraint Layout。我有以下观点:

<View
    android:id="@+id/view"
    android:layout_width="1dp"
    android:layout_height="0dp"
    android:layout_marginBottom="4dp"
    android:layout_marginTop="8dp"
    android:background="@android:color/transparent"
    app:layout_constraintBottom_toTopOf="@+id/checkbox"
    app:layout_constraintEnd_toEndOf="@+id/checkbox"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="@+id/checkbox"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_chainStyle="spread_inside" />

<View
    android:id="@+id/line"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:background="@android:color/black"
    android:alpha="0"
    android:transformPivotY="0dp"
    app:layout_constraintBottom_toBottomOf="@+id/view"
    app:layout_constraintEnd_toEndOf="@+id/view"
    app:layout_constraintStart_toStartOf="@+id/view"
    app:layout_constraintTop_toTopOf="@+id/view"
    app:layout_constraintVertical_bias="0" />

视图有android:layout_height=1dp。这相当于match_constraint。我想以编程方式获得此视图的高度。由于我只需要在用户输入上使用此值,因此无需担心视图生命周期。

通过使用view.layoutParams.height之类的方法,我得到0dp,这是错误的,因为视图的高度大于(受match_constraint约束)。它可能错误地反映了xml中的值。

使用view.height我得到了例如103,但我认为视图的高度实际上小于此值,因为分配line.animate().scaleY(view.height.toFloat())会使得线条的高度比视图的高度大得多

1 个答案:

答案 0 :(得分:0)

我还没有使用Constraint Layout,但我认为它与答案无关,所以我发现了这些:

  1. 关于view.animate().scaleY()的文档不是很清楚,但是从一些实验中我认为这是比例因子(因此1将不会给出任何更改,2会使视图翻倍,等等)。
  2. 如果您需要的是视图的高度,并且您获得0,则可能需要在计算视图布局后获取它,即使用view.getViewTreeObserver().addOnGlobalLayoutListener
  3. 例如:

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
        @Override  
        public void onGlobalLayout() {  
            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);  
            view.animate().scaleY(2).setDuration(1000);  
            int height = view.getHeight();
            ...
        }  
    });