【问题标题】:Shape drawable in layer-list rendered incorrectly for APIs below 23对于低于 23 的 API,图层列表中的可绘制形状不正确呈现
【发布时间】:2017-01-17 13:05:05
【问题描述】:

昨天,我切换到了 Android Studio 2.1.3 版。今天,我重新打开了我的一个项目并尝试添加一些图层列表可绘制对象以用于ImageView。比如这个:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:width="80px" android:height="80px"
        android:top="0px" android:left="0px" 
        android:right="0px" android:bottom="0px">
        <shape android:shape="rectangle">
            <solid android:color="@color/deep_orange"/>
        </shape>
    </item>
    <item android:width="60px" android:height="60px"
        android:top="10px" android:left="10px" 
        android:right="10px" android:bottom="10px">
        <shape android:shape="oval">
            <solid android:color="@color/light_yellow"/>
        </shape>
    </item>
</layer-list>

这是我在升级我的 Android Studio 版本之前得到的,如果我选择 23 作为“在 IDE 中渲染布局时使用的 Android 版本”,这就是我现在在预览中得到的。

但是,如果我选择 23 以下的任何版本,我只会得到正方形:

不幸的是,在模拟器 (Lollipop 22) 或设备 (Jellybean 18) 上运行应用程序时,我只得到正方形。

以防万一这有帮助:

  • 编译SdkVersion 23
  • buildToolsVersion "23.0.3"
  • minSdkVersion 11
  • targetSdkVersion 23
  • buildType 调试没有任何内容
  • 依赖:编译'com.android.support:appcompat-v7:23.0.1'
  • Activity 扩展 AppCompatActivity

我认为问题与上层使用topleftrightbottom 有关。因为如果我只是在正方形顶部放置一个圆圈,预览和“真实的东西”就可以按预期在所有 API 级别上工作。

编辑我还用相同的代码/xml和以下(自动创建)build.gradle开始了一个全新的项目:

  • 编译SdkVersion 24
  • buildToolsVersion "24.0.2"
  • minSdkVersion 15
  • targetSdkVersion 24
  • buildType 调试没有任何内容
  • 依赖:编译'com.android.support:appcompat-v7:24.2.0'
  • Activity 扩展 AppCompatActivity

此处的行为相同:如果我使用 topleftrightbottom 的值 != 0,则不会为 API 级别


所以我的问题是:如何使用 Android Studio 2.1.3 为所有 API 级别创建“带有插图”的形状可绘制对象?

【问题讨论】:

  • 如果将top 和其他人设置为:android:top="0px" 会怎样?
  • @pskink - 如果我对上层执行此操作,那么在 23 的预览中,我会在橙色正方形(80 像素)上方的左上角看到一个直径为 60 像素的圆圈,对于 22,我得到了两个在(矩形)预览中拉伸到最大的形状。在我的 (22) 模拟器上,drawable 填充了 ImageView (80dp x 80dp)
  • 只需在 6.0 模拟器上运行:&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;layer-list xmlns:android="http://schemas.android.com/apk/res/android"&gt; &lt;item android:drawable="@drawable/chrome"/&gt; &lt;item android:drawable="@drawable/mask_orig" android:left="20dp" android:top="20dp" android:right="20dp" android:bottom="20dp"/&gt; &lt;/layer-list&gt; 并且运行良好
  • @pskink - 是的,这就是重点:6.0 = API 级别 23,所以没问题。但是对于棒棒糖或果冻豆,我没有上层:(
  • 哦,对了,对不起,现在正在尝试 5.0...

标签: android android-studio layer-list android-shapedrawable


【解决方案1】:

首先感谢@pskink帮我分析问题:)

问题中的 xml 适用于 API 级别 23+,因为

可以在“item”标签内设置宽度和高度

喜欢@android developerthis SO post 中的状态

它不适用于较低版本,因为需要使用size 标签为ShapeDrawable 设置widthheight 属性。

我认为 Android 需要大小来确定如何缩放可绘制对象(-> 纵横比!),同时考虑到插图(上、左、右、下)。

有时与格式错误的(针对特定 API 级别)xml 的情况一样,Android 默默地失败了,根本没有绘制形状。

所以解决办法是:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:width="80px" android:height="80px"
        android:top="0px" android:left="0px" 
        android:right="0px" android:bottom="0px">
        <shape android:shape="rectangle">
            <solid android:color="@color/deep_orange"/>
        </shape>
    </item>
    <item android:width="60px" android:height="60px"
        android:top="10px" android:left="10px" 
        android:right="10px" android:bottom="10px">
        <shape android:shape="oval">
            <solid android:color="@color/light_yellow"/>
            <size android:height="60px" android:width="60px"/>
        </shape>
    </item>
</layer-list>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2021-05-18
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多