RelativeLayout LayoutParams 缩放不正确
RelativeLayout LayoutParams incorrect scaling
我在 XML 文件中有一个相对布局,其中包含一个包含图像宽度和高度的 ImageView 元素。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/tankHeight"
android:layout_width="210dp"
android:layout_height="350dp"
android:layout_centerInParent="true"
app:srcCompat="@drawable/tank_progress" />
然后我尝试在 class 中调用该方法时动态更改图像的高度(仅高度,而不是宽度),如下所示...
public void updateTank() {
ImageView myTank = (ImageView)findViewById(R.id.tankHeight);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)
myTank.getLayoutParams();
params.height = 350 - 35;
myTank.setLayoutParams(params);
}
但是,当调用此方法时,图像似乎在高度 和 宽度上按指定量缩放,而我只想将高度减小 35 像素。我的理解是这可能是由于使用了相对布局,但我不确定如何解决这个问题,因此我只能以编程方式更改高度。通过阅读 and this,我认为该方法设置正确,所以不确定为什么显示与预期不同?
更改视图高度 and/or 宽度需要重新绘制,请尝试调用 requestLayout()
。希望对你有帮助。
public void updateTank() {
ImageView myTank = (ImageView)findViewById(R.id.tankHeight);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)
myTank.getLayoutParams();
params.height = 350 - 35;
myTank.setLayoutParams(params);
myTank.requestLayout();
}
我相信你应该先将 dp 转换为像素。
public int convertDpToPixel(float dp) {
Context context = getContext();
if (context == null) {
return 0; // context should never be a null
}
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
return (int) (dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
}
然后你可以调用
myTank.getLayoutParams();
params.height = convertDpToPixel(350) - convertDpToPixel(35);
myTank.setLayoutParams(params);
ImageView
的默认 ScaleType
是 FIT_CENTER
。这意味着源图像将被缩放,以便您可以看到整个事物,而不管视图的纵横比如何......所以即使你的 ImageView 可能只是改变它的高度,图像内容 正在两个维度上缩放,尽管只有视图高度发生变化。
尝试在您的 ImageView 标签上设置 android:scaleType="centerCrop"
。这将允许您调整视图大小而无需重新缩放图像内容。
有关秤类型的更多信息:https://robots.thoughtbot.com/android-imageview-scaletype-a-visual-guide
我在 XML 文件中有一个相对布局,其中包含一个包含图像宽度和高度的 ImageView 元素。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/tankHeight"
android:layout_width="210dp"
android:layout_height="350dp"
android:layout_centerInParent="true"
app:srcCompat="@drawable/tank_progress" />
然后我尝试在 class 中调用该方法时动态更改图像的高度(仅高度,而不是宽度),如下所示...
public void updateTank() {
ImageView myTank = (ImageView)findViewById(R.id.tankHeight);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)
myTank.getLayoutParams();
params.height = 350 - 35;
myTank.setLayoutParams(params);
}
但是,当调用此方法时,图像似乎在高度 和 宽度上按指定量缩放,而我只想将高度减小 35 像素。我的理解是这可能是由于使用了相对布局,但我不确定如何解决这个问题,因此我只能以编程方式更改高度。通过阅读
更改视图高度 and/or 宽度需要重新绘制,请尝试调用 requestLayout()
。希望对你有帮助。
public void updateTank() {
ImageView myTank = (ImageView)findViewById(R.id.tankHeight);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)
myTank.getLayoutParams();
params.height = 350 - 35;
myTank.setLayoutParams(params);
myTank.requestLayout();
}
我相信你应该先将 dp 转换为像素。
public int convertDpToPixel(float dp) {
Context context = getContext();
if (context == null) {
return 0; // context should never be a null
}
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
return (int) (dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
}
然后你可以调用
myTank.getLayoutParams();
params.height = convertDpToPixel(350) - convertDpToPixel(35);
myTank.setLayoutParams(params);
ImageView
的默认 ScaleType
是 FIT_CENTER
。这意味着源图像将被缩放,以便您可以看到整个事物,而不管视图的纵横比如何......所以即使你的 ImageView 可能只是改变它的高度,图像内容 正在两个维度上缩放,尽管只有视图高度发生变化。
尝试在您的 ImageView 标签上设置 android:scaleType="centerCrop"
。这将允许您调整视图大小而无需重新缩放图像内容。
有关秤类型的更多信息:https://robots.thoughtbot.com/android-imageview-scaletype-a-visual-guide