Получить высоту вида, когда часть вида находится за пределами экрана? - PullRequest
0 голосов
/ 06 октября 2018

Допустим, у меня есть структура вида, подобная

<ConstraintLayout>
    <CustomViewLayout>
        ...
        ...
    </CustomViewLayout>
</ConstraintLayout>

Это упрощено, но я использую вышеупомянутое на нижнем листе и иногда изменяю высоту ConstraintLayout и высоту просмотра нижнеголист в зависимости от моей CustomViewLayout высоты.Моя проблема в том, что если часть CustomViewLayout обрезана, то есть - она ​​находится за пределами экрана, потому что ConstraintLayout недостаточно высока - я больше не могу получить правильную "полную высоту"Это.В этом случае я всегда вижу только видимую часть на экране вида.

Так как же я могу получить полную высоту вида, который частично находится за пределами экрана?

Спасибо!

Редактировать:

Я должен добавить, что то, что я пробовал, это globalLayoutListener, а также customViewLayout.post {} (и обычно customViewLayout.height конечно).Но ни один из них не измеряет полную высоту, когда часть вида находится за пределами экрана.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Чтобы проверить мой предыдущий ответ, я разработал тестовый проект, чтобы изучить точную ситуацию.Было успешно измерить высоту макета, когда некоторая его часть находилась за пределами экрана (высота макета была измерена 4231px , где высота экрана была 1920px ).Если изображение достаточно длинное и не полностью отображается на экране, вы должны поместить его в прокручиваемый вид.Поэтому я поместил customViewLayout в NestedScrollView, чтобы использовать остаточную сумму прокрутки после расширения нижнего листа.Вот код и результат:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:showIn="@layout/activity_main"
    tools:context=".MainActivity">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/layoutBottomSheet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <LinearLayout
                android:id="@+id/customViewLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:background="@color/colorAccent">

                <TextView
                    android:id="@+id/stateTextView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#FFFFFF"
                    android:layout_marginTop="16dp"
                    android:gravity="center_horizontal"/>

                <TextView
                    android:id="@+id/sizeTextView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#FFFFFF"
                    android:padding="24dp"
                    android:gravity="center_horizontal"/>

                <TextView
                    android:id="@+id/contentTextView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#FFFFFF"
                    android:padding="24dp"
                    android:text="@string/lorem"
                    android:gravity="center_horizontal"/>

            </LinearLayout>

        </android.support.v4.widget.NestedScrollView>

    </android.support.constraint.ConstraintLayout>

</android.support.design.widget.CoordinatorLayout>

MainActivity:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        customViewLayout.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                customViewLayout.viewTreeObserver.removeGlobalOnLayoutListener(this)
                val height = customViewLayout.measuredHeight
                val width = customViewLayout.measuredWidth
                sizeTextView.text = "Height: $height px                Width: $width px"
            }
        })

        val sheetBehavior = BottomSheetBehavior.from(layoutBottomSheet)
        sheetBehavior.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
            override fun onSlide(bottomSheet: View, offset: Float) {
            }

            override fun onStateChanged(bottomSheet: View, newState: Int) {
                when (newState) {
                    BottomSheetBehavior.STATE_HIDDEN -> stateTextView.text = "State: Hidden"
                    BottomSheetBehavior.STATE_EXPANDED -> stateTextView.text = "State: Expanded"
                    BottomSheetBehavior.STATE_COLLAPSED -> stateTextView.text = "State: Collapsed"
                    BottomSheetBehavior.STATE_DRAGGING -> stateTextView.text = "State: Dragging"
                    BottomSheetBehavior.STATE_SETTLING -> stateTextView.text = "State: Settling"
                }
            }
        })
    }

}

Экран:

enter image description here

0 голосов
/ 06 октября 2018

Если вы ищете ширину и высоту вида, попробуйте это:

mCustomViewLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mCustomViewLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            int height = mCustomViewLayout.getMeasuredHeight()
            int width = mCustomViewLayout.getMeasuredWidth()
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...