如何在 HorizontalScrollView 中获取 ImageView 全宽
How to get ImageView full width when inside a HorizontalScrollView
我在 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。虽然高度返回正确。
任何帮助将不胜感激,
非常感谢。
我没有使用 Glide 的经验。
您正在设置所有视图/容器android:layout_height="0dp"
首先尝试将其更改为任何其他任意值或 wrap_content
.
您没有附上获取高度的代码。
你试过了吗mapImage.getHeight()
对于Bitmap,我以前是这样获取的
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 时,删除侦听器并继续我的代码。
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
}
}
});
可能不是完美的解决方案,在图像显示之前会有一小段延迟 - 但对于我的用例来说没问题。
我在 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。虽然高度返回正确。
任何帮助将不胜感激, 非常感谢。
我没有使用 Glide 的经验。
您正在设置所有视图/容器android:layout_height="0dp"
首先尝试将其更改为任何其他任意值或 wrap_content
.
您没有附上获取高度的代码。
你试过了吗mapImage.getHeight()
对于Bitmap,我以前是这样获取的
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 时,删除侦听器并继续我的代码。
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
}
}
});
可能不是完美的解决方案,在图像显示之前会有一小段延迟 - 但对于我的用例来说没问题。