仅使用一个(高密度)图像在所有设备的滚动视图中缩放到宽度

问题描述 投票:0回答:1

我正在开发一种指令应用程序。它使用ScrollvView片段,垂直LinearLayout和一些TextViews / ImageViews来解释产品的工作原理。

由于Android上缺少矢量图像支持,图像只是简单的矢量图形,我保存为png。这是一个例子:

图像总是使用android:scaleType="fitXY"(portait和landscape)填充屏幕,并且scrollviewer负责其余部分(使用android:adjustViewBounds="true"in图像视图来优先滚动图像的原始大小)。

我阅读了Google的指南,针对不同的分辨率和密度使用不同的版本,但这似乎是为了我的目的而过度设计。我的想法是在drawable文件夹中提供一个高分辨率(2000px宽度)图像的图像,让Android自动缩放完成剩下的工作。

我能想到的唯一问题是记忆。但我不太确定内部是如何工作的。如果仅在显示图像时出现OutOfMemory,则它应该不是问题,因为自动缩放首先会出现问题。

如果缩放器可能遇到内存问题我正在考虑使用具有不同宽度的图像的3个版本(即800像素,1500像素和2200像素)并将它们放在不同的资源目录中。这似乎不可能......资源目录的Android Studio向导有一个“最小屏幕宽度”的选项,但它只适用于dp(与密度无关的像素)!我想要一个真实设备像素的资源文件。我希望Android采用最接近的拟合,如果无法找到完全匹配,则不会回退到默认值。我的图像并不关心密度,因为它们总是填满屏幕。

简而言之:

  • 仅提供一个小文件大小的大像素图像是一个问题吗?
  • 如果是,我该如何设置设备像素资源目录?

该应用程序的性质已经有大量的图像。这就是为什么我不想每次复制几次x倍数量的图像来处理。该应用程序适用于API 11。

android image scrollview image-scaling autoscaling
1个回答
1
投票

我终于找到了一种解决方案,可以将一个图像按比例缩放到设备宽度而不会出现内存问

  1. 首先,你必须以相当高的分辨率绘制你的图像(my_image.png)
  2. 将此图像仅放入drawable-xxhdpi文件夹中。
  3. 使用this非常棒的答案扩展Android ImageView类。
  4. 在您的布局中使用它,如下所示:

这是适合我的布局:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:fillViewport="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/main_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />

        <my.package.name.DynamicImageView
            android:id="@+id/main_image"
            android:adjustViewBounds="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/main_text_view"
            android:src="@drawable/my_image"
            android:scaleType="fitXY"/>

        <my.package.name.DynamicImageView
            android:id="@+id/main_image2"
            android:adjustViewBounds="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/main_image"
            android:src="@drawable/my_image"
            android:scaleType="fitXY"/>

        <TextView
            android:id="@+id/main_text_view2"
            android:layout_below="@id/main_image2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />

    </RelativeLayout>
</ScrollView>

一些更多的最终信息:在我找到第3点的解决方案之前,我使用第2点(将图像放入哪个文件夹)进行了大量测试。

如果你把图像放在标准的drawable文件夹中,缩放就可以在没有第3点的情况下工作,但是你可能会在旧设备上遇到OutOfMemory异常,因为android会尝试扩展已经很大的图像(Android认为drawable只是小图像而没有检查它们的大小) 。

当图像位于drawable-xxhdpi文件夹中时,Android知道其高分辨率,并且只在必要时才进行向下缩放。但它不会在密度拟合设备上将图像缩放到宽度!例如,在Nexus 10中,图像以其原始大小和比例绘制 - 与您为scaleType设置的内容无关(我认为它与inTargetDensity有关,如inScaled描述中所述)。

这里要记住的一件重要事情是我必须在整个内容周围使用ScollView。如果不涉及ScrollView,您可能会找到其他一些解决方案。

最后,您还可以使用drawable-xxxhdpi文件夹,但它是在API 19中引入的。我尝试了它,它也适用于较低的API。 Apparently Android构建工具19.1.0及更高版本负责较低的API版本。

我希望这可以帮助别人...

© www.soinside.com 2019 - 2024. All rights reserved.