在API 19上对VectorDrawable进行缩放

3

我正在编写一个 Android 应用程序,使用 minSdkVersion = 15 进行测试 (在 API 级别 19 上测试)。我想在应用程序中添加一个覆盖层,中间有一张小手机图片。我添加了标准 Android 图片中的可绘制资源 ic_smartphone_black_24dp 并创建了用于覆盖层的 ImageView,如下所示:

<ImageView
    android:id="@+id/overlay"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:alpha="1."
    android:background="@drawable/overlay_full"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

这会呈现覆盖层,但智能手机图片被拉伸到整个ImageView上:screenshot 我尝试了多种方式来缩放手机的图片(参考这里那里和其他许多资源),但都没有奏效。特别是我尝试了:
  • 在gradle.build中添加vectorDrawables.useSupportLibrary = true
  • 添加
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

进入 Activity

  • ImageView 更改为 android.support.v7.widget.AppCompatImageView (在 Java 代码中设置背景而不是在 xml 中)
  • wrap_content 传递给 layout_width/height(并删除约束条件)
  • overlay_full 中设置尺寸:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/overlay_background">
        <size
            android:width="152dp"
            android:height="152dp"/>
    </item>
    <item android:drawable="@drawable/ic_smartphone_black_24dp"
        android:left="30dp"
        android:top="30dp"
        android:right="30dp"
        android:bottom="30dp"
        android:gravity="center"
        android:scaleType="center"
        android:width="30dp"
        android:height="30dp">
        <size
            android:width="30dp"
            android:height="30dp"/>
    </item>
</layer-list>

这段代码在API 28中运行正常,我也进行了测试。有没有什么办法可以在早期的API版本中实现缩放?

1个回答

1
你可以尝试像这样做:

您可以尝试类似以下方式:

<ImageView
    android:id="@+id/overlay"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:scaleType="center"
    android:background="@drawable/just_the_background"
    app:srcCompat="@drawable/ic_smartphone_black_24dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

此外,在布局中您无需直接使用AppCompat视图,只需让库自动处理即可(它们会在构建时自动替换)。只有当您扩展它们以添加自定义功能时才需要使用它们。

谢谢!这个方法可行,但我担心它在不同屏幕尺寸上的扩展性:无论屏幕大小如何,图像现在都将是24dp吗?(因此与just_the_background缩放方式不同)? - sygi
是的,它始终会是24dp(或者在矢量XML中设置高度/宽度为多少就是多少)。您能描述一下您希望它如何缩放吗? - Philio
为了根据屏幕大小调整图像的比例,一种选择是使用android:scaleType="fitCenter",并且您可以添加填充来创建边框。 - Philio
我的最终目标是拥有一个带有一些静态元素的背景和一个带有动画手机的前景。我担心如果我在边框上添加填充,Android将自动缩小我的图像,以便在移动时由于动画将其全部(包括填充)放在屏幕上。 另一方面,如果它始终为24dp,则当背景被缩放到不同大小时,它很可能与背景的静态元素相交。 我想让背景和前景一起缩放,并且手机不会填满整个屏幕(无论是物理上还是通过填充)。你认为呢? - sygi
听起来在这种情况下,值得使用ConstraintLayout中的多个视图,并以不重叠的方式约束它们,例如使用链或仅相对于彼此定位。如果您可以添加一个图像来演示您想要实现的内容(例如线框图),那么提供更完整的答案可能会更容易。 - Philio
实际上,我最终做了你建议的事情(假设没有缩放)。感谢您的帮助,抱歉抱怨了 :P - sygi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接