Android - получить значение высоты просмотра, соответствующее match_constraint (0dp)?

Я использую макет ограничения. У меня следующие взгляды:

<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
369
1

Ответы 1

Я еще не работал с макетом ограничений, но не думаю, что это имеет отношение к ответу, поэтому вот что я нашел:

  1. Документация по view.animate().scaleY() не очень ясна, но, немного поэкспериментировав, я думаю, что это масштаб фактор (так что 1 не даст никаких изменений, а 2 удвоит обзор и т. д.).
  2. Если вам нужна высота представления, и вы получаете 0, вы можете получить его после того, как был рассчитан макет представления, т.е. используйте view.getViewTreeObserver().addOnGlobalLayoutListener

Например:

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

Другие вопросы по теме