Android的layer-list不显示缩放的Drawable项?

10
使用下面的图层列表,我的比例可绘制对象从未显示。为什么会这样?

menu_dialog_header.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape>
      <solid android:color="@color/black"></solid>
    </shape>
  </item>
  <item>
    <scale
      android:scaleHeight="50%"
      android:scaleWidth="100%"
      android:scaleGravity="top"
      android:drawable="@drawable/shine" />
  </item>
</layer-list>

shine.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <solid android:color="@color/shine" />
</shape>

menu_dialog.xml

<!-- header -->
<LinearLayout
  android:background="@drawable/menu_dialog_header"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="center_horizontal|center"
  android:padding="8dp"
  android:orientation="horizontal" >
  ...
2个回答

14
我有一个可能对你有用的解决方法:不要使用<scale>,而是尝试使用<inset>。你可以使用<item>android:top/android:bottom/android:left/android:right<inset>android:insetXXX组合来调整图像的大小。
你可以按照源图像的尺寸设置每个插入值的边缘。例如,如果你有一个宽度为64像素的图片,并想将其减少50%,则可以对每个边缘执行(64/4 = 16)。

1
我不明白这与单个项目的使用有何不同。你能举个例子吗? - Michaël
1
@Joe,我的朋友,你真是个大王!我必须通过编程来实现更通用的机制,因此存在不可变性的问题,但这个插入的想法正是我所需要的。 - AsafK
1
有趣的是,我重新开始使用Android并忘记了我曾经问过这个问题。我正在一个新项目中使用这个插入答案,因为我不认为在2011年(v2.3)时它是一个选项。 - worked
2
当然。即使它是一个选项,有时它可能会被埋在某个页面上,或者你后来发现如何使用它并说“哦!原来是这样!”或者“我从未想过那个!”我还希望积极地防止http://xkcd.com/979/。 - Joe Plante

7
这并不完全是LayerLists的错误。ScaleDrawable还依赖于drawable的级别,在Drawable Resources和ScaleDrawable文献中都有简要提到。
似乎没有关于ScaleDrawable如何解释级别的文档。
在XML中似乎没有设置drawable级别的方法,这反映了ScaleDrawable的主要用例是通过动画改变drawable大小。因此,你需要在代码中设置drawable的级别。
我非常理解你在这里使用ScaleDrawable的情况,因为它允许通过定位和定义其大小的方式更强大地堆叠可绘制对象。

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