Я помещаю очень широкое изображение в HorizontalScrollView.
Высота ImageView / ScrollView является динамической, поскольку я установил высоту 0dp и добавил ограничения.
Поскольку тип масштаба ImageView - fitStart, а AdjustViewBounds - это true - ширина изображения изменяется.

XML:

     <HorizontalScrollView
        android:id="@+id/mapScrollView"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginBottom="10dp"
        app:layout_constraintBottom_toTopOf="@id/playButton"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <android.support.constraint.ConstraintLayout
            android:id="@+id/mapLayout"
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/mapImage"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:adjustViewBounds="true"
                android:scaleType="fitStart"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <com.gigi.testmap.activities.quest.QuestMapPathView
                android:id="@+id/mapLinesView"
                android:layout_width="0dp"
                android:layout_height="0dp"
                app:layout_constraintBottom_toBottomOf="@id/mapImage"
                app:layout_constraintEnd_toEndOf="@id/mapImage"
                app:layout_constraintStart_toStartOf="@id/mapImage"
                app:layout_constraintTop_toTopOf="@id/mapImage" />

        </android.support.constraint.ConstraintLayout>

    </HorizontalScrollView>


Я пытаюсь получить ширину ImageView (общая ширина, видимая и невидимая часть). Получение общей ширины ScrollView также поможет.
Моя цель - разместить кнопки поверх карты в позициях, рассчитанных в соответствии с шириной и высотой визуализированного ImageView.

Я загружаю изображение с помощью Glide:

final ImageView mapImage = mActivity.findViewById(R.id.mapImage);
Glide.with(mActivity).load(R.drawable.fullmap).into(mapImage);

mapImage.getViewTreeObserver().addOnGlobalLayoutListener(new 
ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mapImage.getWidth(); // --> returns 0    
        mapImage.getViewTreeObserver()
             .removeOnGlobalLayoutListener(this);
    }
 });

Я попытался получить ширину, используя прослушиватель глобального макета наблюдателя в виде дерева, но все, что я получил, это 0. Высота возвращается правильно, хотя .

Любая помощь будет высоко ценится, большое спасибо.

0
gioravered 9 Янв 2019 в 12:11

3 ответа

Лучший ответ

Кажется, что изображение отображается не полностью после первого вызова слушателя глобального макета в виде дерева (я думаю, это из-за того, что ширина изображения довольно велика) - я сделал проверку ширины изображения и только если больше 0 удалить слушателя и продолжить мой код.

final ImageView mapImage = mActivity.findViewById(R.id.mapImage);
        Glide.with(mActivity).load(R.drawable.fullmap).into(mapImage);
        mapImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (mapImage.getWidth() > 0) {
                    mapImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    //continue width related code here
                }
            }
        });

Возможно, не идеальное решение, и есть небольшая задержка, пока изображение не появится - но это нормально для моего случая использования.

0
gioravered 9 Янв 2019 в 12:09

Для битмапа я привык так

Glide.with(mContext())
 .asBitmap()
 .load(path)
 .into(new SimpleTarget<Bitmap>() {
     @Override
     public void onResourceReady(Bitmap bitmap,
                                 Transition<? super Bitmap> transition) {
         int w = bitmap.getWidth();
         int h = bitmap.getHeight()

     }
 });
0
notTdar 9 Янв 2019 в 09:43

У меня нет опыта работы с Glide.

Вы устанавливаете все представления / контейнеры android:layout_height="0dp" попробуйте сначала изменить его на любое другое произвольное значение или wrap_content.

Вы не прикрепили код того, как вы пытаетесь получить высоту.

Вы пробовали mapImage.getHeight()

0
Snufkin 9 Янв 2019 в 09:36