在Horizo​​ntalScrollView内时如何获取ImageView全宽

时间:2019-01-09 09:11:45

标签: android android-imageview android-scrollview


我将一个非常宽的图像放置在Horizo​​ntalScrollView中。
由于我将高度设置为0dp并添加了约束,因此ImageView / ScrollView的高度是动态的。
由于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。尽管高度正确返回了

任何帮助将不胜感激, 非常感谢。

3 个答案:

答案 0 :(得分:0)

我没有使用Glide的经验。

您正在设置所有视图/容器android:layout_height="0dp" 首先尝试将其更改为任何其他任意值或wrap_content

您没有附加尝试如何获得身高的代码。

您尝试过mapImage.getHeight()

答案 1 :(得分:0)

对于位图,我曾经采用这种方式

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()

     }
 });

答案 2 :(得分:0)

似乎第一次调用树视图全局布局侦听器后,图像无法完全渲染(我想是因为图像宽度很大)-我所做的是检查图像宽度,并且仅当大于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
                }
            }
        });

也许不是完美的解决方案,并且在显示图像之前会有一点延迟-但对于我的用例来说还可以。