Android Lollipop上的提升无法正常工作

时间:2014-10-26 10:32:38

标签: android android-5.0-lollipop

我正在尝试使用最新的Android Lollipop预览版中的elevation属性。我将targetSdk设置为21,将主题设置为Material。接下来,我将一个背景形状添加到TextView并将高程设置为8dp,但TextView没有显示任何阴影的迹象。这是在运行棒棒糖预览的Nexus7上。还有什么我需要考虑的吗?

这是布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/rect"
      android:text="hallo world"
      android:padding="8dp"
      android:elevation="8dp" />

</LinearLayout>

这是可绘制的背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
    <solid android:color="#7d0073ff" />
    <corners android:radius="16dp" />
</shape>

这是TextView:

Android elevation

9 个答案:

答案 0 :(得分:59)

出于某种原因,如果使用透明度设置纯色,则不会显示高程阴影。

在你的例子中,我将#7d0073ff更改为#0073ff并且我得到了一个阴影。

这可能是一个错误,因为在documentation中它使用半透明的背景颜色给出了类似的例子。

答案 1 :(得分:18)

再次浏览文档后,我终于找到了解决方案。

只需将card_view:cardUseCompatPadding="true"添加到CardView,就会在Lollipop设备上显示阴影。

发生的情况是,CardView中的内容区域在棒棒糖前和棒棒糖设备上采用不同的大小。因此,在棒棒糖设备中,阴影实际上被卡覆盖,因此它不可见。通过添加此属性,内容区域在所有设备上保持不变,阴影变为可见。

我的xml代码如下:

<android.support.v7.widget.CardView
    android:id="@+id/media_card_view"
    android:layout_width="match_parent"
    android:layout_height="130dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardElevation="2sp"
    card_view:cardUseCompatPadding="true"
    >
...
</android.support.v7.widget.CardView>

答案 2 :(得分:17)

将Android:高程阴影添加到ImageView:

android:clipToPadding="false"
+
android:outlineProvider="bounds"
+
android:elevation="2dp"

答案 3 :(得分:9)

我也遇到了这个问题,事实证明,你需要在Android清单中打开硬件加速

<application
  ...
  android:hardwareAccelerated="true">

答案 4 :(得分:4)

请注意,如果清单中有以下行,则阴影不会显示:

<强> 机器人:硬件加速=&#34;假&#34;

答案 5 :(得分:3)

<强> TL; DR

检查您的卡片:(或您使用的任何字词)命名空间声明,并确保它符合以下条件: xmlns:card =&#34; http://schemas.android.com/apk/res -auto&#34;

我知道这里已经有一些答案,但我想添加我的答案,因为它不包含在这些当前的建议中。为了让阴影在KitKat和Marshmallow上运行,(我只尝试过模拟器,我确定它可以兼顾)我将以下xml属性添加到我的卡中:

card:cardElevation="25dp"
card:cardUseCompatPadding="true"

在我的桌子上碰到我为什么不能正常工作之后,试图将卡片的背景颜色设置为完全不透明的东西,在清单中启用硬件加速,甚至祈祷,我检查了名称空间声明在我的档案中。令我恐惧的是,我看到卡片xml命名空间已分配给以下内容:

xmlns:card="http://schemas.android.com/tools"

在修复了这个命名空间声明之后,我再次运行了我的虚拟应用程序,让我们松了一口气,因为阴影终于按预期显示了。

如果您是像我这样的怀疑者,这是证据。请谷歌,Android,无论谁:让阴影再次变得美好。他们不应该这么困难。

enter image description here

以下是创建下图所示布局的整个文件:

<?xml version="1.0" encoding="utf-8"?>

<!--MAKE SURE YOU HAVE THE RIGHT XML NAMESPACE ASSIGNED-->
<!--TO WHATEVER WORD YOU PUT IN FRONT OF THE CARD-->
<!--XML ATTRIBUTES. IN THIS CASE, MINE IS card-->
<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#607D8B"
    android:fitsSystemWindows="true"
    tools:context="com.mlustig.playground.MainActivity">

    <android.support.v7.widget.CardView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        app:layout_aspectRatio="66%"
        app:layout_heightPercent="75%"
        card:cardElevation="25dp"
        card:cardUseCompatPadding="true" />
</android.support.percent.PercentRelativeLayout>

是的,我知道。很烦人,你不能简单地复制和粘贴这个布局并运行它,因为它里面有PercentRelativeLayout,但我故意把它留在那里。你绝对应该check out。超级强大,非常有用。不错不错。希望这有帮助。

答案 6 :(得分:2)

如前所述,这是Android中的open bug:如果背景可绘制使用带透明度的纯色,则不会显示阴影。

要解决此问题,请在其自己的单独视图中显示背景,并在该视图上设置Alpha。将背景视图和TextView包裹在RelativeLayout中,将背景直接放在TextView下方并使用android:layout_alignLeftandroid:layout_alignBottom等,使其大小相同。它们需要处于同一高度,背景必须出现在xml中的TextView之前,以便在它下面绘制。

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="40dp"
    android:paddingRight="40dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:clipToPadding="false"
    android:background="#ffffff">

    <View
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/text_view"
        android:layout_alignRight="@id/text_view"
        android:layout_alignBottom="@id/text_view"
        android:layout_alignTop="@id/text_view"
        android:background="@drawable/rect"
        android:alpha="0.5"
        android:elevation="8dp"/>


    <TextView
        android:id="@id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hallo world"
        android:textColor="#ffffff"
        android:padding="8dp"
        android:elevation="8dp" />

</RelativeLayout>

drawable与你的相同但没有透明度:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#0073ff" />
    <corners android:radius="16dp" />
</shape>

结果:

Result

一些值得注意的要点:

  • 您必须确保封闭的RelativeLayout足够大以显示阴影。如果您只是将其尺寸设置为wrap_content而没有填充,则阴影将被剪切到布局的边界。如this question中所述,您可以使用填充并设置android:cipToPadding="false"使其足够大以容纳阴影。在这种情况下你可能不需要那么多的填充,我还没有尝试过。
  • 在这种情况下,我们需要为背景使用单独的视图,因为如果我们直接在alpha上设置了TextView,那么文本也会受到影响。根据您的使用情况,您可能不需要单独的视图和封闭布局,并且可能只有一个视图,视图上设置了alpha,并且绘图中没有透明度。

答案 7 :(得分:1)

尝试使用:app:cardElevation =“4dp”

答案 8 :(得分:0)

尝试为CardView添加边距。