【问题标题】:Scaling a VectorDrawable on API 19在 API 19 上缩放 VectorDrawable
【发布时间】:2019-03-30 13:12:38
【问题描述】:

我正在用minSdkVersion = 15 编写一个Android 应用程序(19 日测试)。我想在中间有一张小手机图片的叠加层。我从标准 Android 的图片中添加了可绘制 (xml) 资源 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:

我尝试以各种方式缩放手机的图片(阅读thisthat 和许多其他方式),但都没有奏效。特别是我尝试过:

  • vectorDrawables.useSupportLibrary = true 添加到gradle.build
  • 添加
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

到活动

  • ImageView 更改为 android.support.v7.widget.AppCompatImageView(并在 java 代码中而不是在 xml 中设置背景)
  • 传递 wrap_content 而不是 0dp 作为 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 版本中进行这种缩放吗?

【问题讨论】:

    标签: java android android-drawable scaling android-vectordrawable


    【解决方案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 的缩放比例不同)?
    • 是的,它总是 24dp(或者你在向量的 XML 中设置的高度/宽度)。您能否描述一下您希望它如何扩展?
    • 要根据屏幕大小缩放图像,一种选择是使用android:scaleType="fitCenter",您可以添加填充来创建边框。
    • 我的最终目标是制作带有一些静态元素的背景和带有动画手机的前景。恐怕如果我在边框上添加填充,Android 会在图像移动时自动缩小我的图像,因为动画将其全部(包括填充)放在屏幕上。另一方面,如果它始终是 24dp,那么每当背景缩放到不同的大小时,它可能会与背景的静态元素相交。我想将背景和前景比例放在一起,并且手机不要填满整个屏幕(无论是物理上还是通过填充)。 WDYT?
    • 听起来在这一点上可能值得在ConstraintLayout 中使用多个视图并以不重叠的方式约束它们,例如使用链或只是将它们相对于彼此定位。如果您可以添加图像来展示您想要实现的目标(例如线框),那么提供更完整的答案可能会更容易。
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多