【问题标题】:RelativeLayout LayoutParams incorrect scalingRelativeLayout LayoutParams 缩放不正确
【发布时间】:2019-01-15 20:42:10
【问题描述】:

我在 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,我认为该方法设置正确,所以不确定为什么它的显示与预期不同?

【问题讨论】:

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


    【解决方案1】:

    ImageView 的默认 ScaleTypeFIT_CENTER。这意味着源图像将被缩放,以便您可以看到整个事物,而不管视图的纵横比如何......所以即使你的 ImageView 可能只是改变它的高度,图像内容在两个维度上都被缩放,尽管只有视图高度发生变化。

    尝试在 ImageView 标记上设置 android:scaleType="centerCrop"。这将允许您在不重新缩放图像内容的情况下调整视图大小。

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

    【讨论】:

    • 啊哈!这似乎具有预期的效果,但是,高度是从图像底部向上减小,而不是“自上而下”。你知道是否有一种方法可以设置从图像的哪个“端”移除像素的偏好?
    • 嗯,我猜你会看到它在两端均匀收缩。我不知道如何解决这个新问题,抱歉。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为您应该首先将 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        相关资源
        最近更新 更多