RelativeLayout LayoutParams缩放错误

时间:2018-08-08 14:24:21

标签: java android android-layout android-relativelayout layoutparams

我在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" />

然后我尝试在类中调用该方法时动态更改图像的高度(仅高度而不是宽度),如下所示...

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个像素时,调用此方法时,图像似乎会按高度宽度按指定的比例缩放。我的理解是,这可能是由于使用了相对布局引起的,但是我不确定如何克服此问题,因此我只能以编程方式更改高度。通过阅读thisthis,我认为该方法设置正确,因此不确定为什么显示的结果与预期的不同吗?

3 个答案:

答案 0 :(得分:0)

更改视图的高度和/或宽度要求将其重新绘制,请尝试调用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();
 }

答案 1 :(得分:0)

我相信您应该先将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);

答案 2 :(得分:0)

ScaleType的默认ImageViewFIT_CENTER。这意味着源图像将被缩放,以便无论视图的宽高比如何都可以看到整个事物...因此,即使您的 ImageView 可能仅改变其高度,< em>图像内容在两个维度上都按比例缩放,尽管只改变了视图高度。

尝试在ImageView标签上设置android:scaleType="centerCrop"。这将允许您调整视图的大小而无需重新缩放图像内容。

有关秤类型的更多信息:https://robots.thoughtbot.com/android-imageview-scaletype-a-visual-guide