【问题标题】:Image View Not Scaling Between Different Devices图像视图无法在不同设备之间缩放
【发布时间】:2020-03-23 14:48:06
【问题描述】:

我的活动结构如下:

使用适配器和 CardView 布局填充的回收视图。

CardView 由一个约束布局组成,其中包含一个图像和两个文本框。

图像设置为从 URL 异步加载的可绘制对象。

这是一些代码:

图片加载:

  try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        Bitmap bitmap = ((BitmapDrawable) d).getBitmap();
        Drawable temp = new BitmapDrawable(Bitmap.createScaledBitmap(bitmap, 300, 300, true));
        return temp;
      }
 catch (Exception e) {
        e.printStackTrace();
        return null;
      }

 This is called later in a different function where vh is the ViewHolder:
   vh.imageView.setImageDrawable(d);

卡片视图 XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.cardview.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="4dp"
        app:cardElevation="4dp"
        app:cardUseCompatPadding="true"
        app:contentPadding="16dp" >

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/playlist_image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/playlist_name"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.0"
                app:srcCompat="@mipmap/ic_launcher" />
etc...

RecyclerView XML:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PlaylistChoose">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/playlist_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="1dp"
        android:layout_marginEnd="1dp"
        android:clickable="true"
        android:focusable="auto"
        android:foreground="?attr/selectableItemBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/custom_playlist_view" >

    </androidx.recyclerview.widget.RecyclerView>

</androidx.constraintlayout.widget.ConstraintLayout>

目前,当我在虚拟设备上运行此代码时,图像看起来很好,但是当我在 Galaxy S7 Edge 上运行应用程序时,图像显得非常小。然后我尝试将Drawable temp = new BitmapDrawable(Bitmap.createScaledBitmap(bitmap, 300, 300, true)); 中的高度和宽度从 300 增加到大约 1400,然后应用程序在 S7 上运行良好,但虚拟设备现在显示的图像大得离谱。我有点困惑,因为图像位于设置为包装内容的约束布局内,并且两部手机的内容大小相同,所以我不明白为什么实际大小会有所不同......提前致谢!任何帮助表示赞赏:)

一些图片:

AVD 1400 : https://gyazo.com/1c4ab4ffb9266e191357dd3e0dcd2f5c

S7 1400:https://gyazo.com/fd87f094bf7f23933543369b206b794a

AVD 300:https://gyazo.com/d5c23c9372bc0c1838866452a24af06f

S7 300:https://gyazo.com/a9084b77d3efdd87cea9e53344c7b169

【问题讨论】:

  • 硬编码图像像素大小不是一个好主意..只需在dp 中使用固定大小ImageView 并使用一些库来有效地为您下载图像may be this one..
  • @ADM 我正在​​使用该库并加载图像,但我并不真正理解您在 dp 中使用固定尺寸的意思,因此它会以非常大的尺寸加载图像。您能否进一步详细说明您的意思?

标签: java android android-recyclerview android-imageview android-drawable


【解决方案1】:

我有点困惑,因为图像位于设置为包装内容的约束布局内,并且两部手机的内容大小相同

不同手机的内容可能相同,但由于不同手机的屏幕尺寸不同,而在您的ImageView 上使用wrap_content 时,它在所有设备上看起来并不相同。

如何解决:

使用ConstraintLayout,你会想要做这样的事情:

将此用作您的图像视图:

  <ImageView
    android:id="@+id/imageView2"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintWidth_percent="0.25"
    app:layout_constraintHeight_percent="0.25"
    android:scaleType="fitXY"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/your_image" />

现在,这将是其父级的宽度和高度的正好 25%。

您可以根据需要更改图像的大小,只需更改:

   app:layout_constraintWidth_percent="0.25"
   app:layout_constraintHeight_percent="0.25"

【讨论】:

  • 对我不起作用,图像仍然很小,我认为 ImageView 没有问题,因为在 xml 中有一个默认图像设置为图像视图的源(在我获得 url 图像之前),并且默认图像在 avd 和 s7 上都可以正常加载。
【解决方案2】:

尝试在 ImageView 中添加 scaleType 和调整视图边界

<ImageView
   android:id="@+id/playlist_image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:scaleType="fitCenter"
   android:adjustViewBounds="true"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toStartOf="@+id/playlist_name"
   app:layout_constraintHorizontal_bias="0.0"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent"
   app:layout_constraintVertical_bias="0.0"
   app:srcCompat="@mipmap/ic_launcher" />

【讨论】:

    【解决方案3】:

    你可以用

      android:scaleType="fitXY"
    

    【讨论】:

    • android:layout_width="match_parent" android:layout_height="match_parent"
    【解决方案4】:
         <ImageView
                android:id="@+id/playlist_image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/playlist_name"
                android:scaleType="fitXY"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
    
                app:srcCompat="@mipmap/ic_launcher" />
    

    【讨论】:

      【解决方案5】:

      解决了!这是由于@ADM 建议使用滑翔库与@Tamir Abutbul 的比例和约束百分比建议的结合,我的图像现在可以正确加载:)

      XML:

      <ImageView
                      android:scaleType="fitXY"
                      app:layout_constraintHeight_percent="1"
                      app:layout_constraintWidth_percent="0.25"
      
                      android:id="@+id/playlist_image"
                      android:layout_width="0dp"
                      android:layout_height="wrap_content"
                      app:layout_constraintBottom_toBottomOf="parent"
                      app:layout_constraintEnd_toStartOf="@+id/playlist_name"
                      app:layout_constraintHorizontal_bias="0.0"
                      app:layout_constraintStart_toStartOf="parent"
                      app:layout_constraintTop_toTopOf="parent"
                      app:layout_constraintVertical_bias="0.0"
                      app:srcCompat="@mipmap/ic_launcher" />
      

      滑行代码:

       Glide.with(context).load(url).into(vh.imageView);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多