我正在尝试使用最新的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:
答案 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,无论谁:让阴影再次变得美好。他们不应该这么困难。
以下是创建下图所示布局的整个文件:
<?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_alignLeft
,android: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>
结果:
一些值得注意的要点:
RelativeLayout
足够大以显示阴影。如果您只是将其尺寸设置为wrap_content
而没有填充,则阴影将被剪切到布局的边界。如this question中所述,您可以使用填充并设置android:cipToPadding="false"
使其足够大以容纳阴影。在这种情况下你可能不需要那么多的填充,我还没有尝试过。alpha
上设置了TextView
,那么文本也会受到影响。根据您的使用情况,您可能不需要单独的视图和封闭布局,并且可能只有一个视图,视图上设置了alpha
,并且绘图中没有透明度。答案 7 :(得分:1)
尝试使用:app:cardElevation =“4dp”
答案 8 :(得分:0)
尝试为CardView
添加边距。