CardView在Android L中不显示阴影
我在Listview内的Cardview在Android L(Nexus 5)中没有显示阴影。 此外,圆形边缘没有正确显示。 这里是Listview的适配器视图的代码:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res/com.example.myapp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="@android:color/white" android:foreground="?android:attr/selectableItemBackground" app:cardCornerRadius="4dp" app:cardElevation="4dp" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin" > <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="@dimen/padding_small" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:textAppearance="?android:attr/textAppearanceLarge" /> <ImageView android:id="@+id/ivPicture" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tvName" android:layout_centerHorizontal="true" android:scaleType="fitCenter" /> <TextView android:id="@+id/tvDetail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ivPicture" android:layout_centerHorizontal="true" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" /> </RelativeLayout> </android.support.v7.widget.CardView>
和ListView的XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res/com.example.myapp" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/app_bg" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:cacheColorHint="#00000000" android:divider="@android:color/transparent" android:drawSelectorOnTop="true" android:smoothScrollbar="true" /> <ProgressBar android:id="@+id/progressBarMain" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="gone" /></RelativeLayout>
它适用于具有适当阴影和圆angular的前L设备。 但不工作Android L设备。 你能告诉我在这里失踪了吗?
再次通过文档后,我终于find了解决办法。
只需在card_view:cardUseCompatPadding="true"
添加card_view:cardUseCompatPadding="true"
,棒棒糖设备上就会出现阴影。
发生的情况是, 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="2dp" card_view:cardUseCompatPadding="true" > ... </android.support.v7.widget.CardView>
在app:cardUseCompatPadding="true"
使用app:cardUseCompatPadding="true"
。 例如
<android.support.v7.widget.CardView android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="@dimen/cardviewMarginRight" app:cardBackgroundColor="@color/menudetailsbgcolor" app:cardCornerRadius="@dimen/cardCornerRadius" app:cardUseCompatPadding="true" app:elevation="0dp"> </android.support.v7.widget.CardView>
不要忘记,要画阴影,你必须使用hardwareAccelerated
加速绘图
hardwareAccelerated = true
hardwareAccelerated = false
有关详细信息,请参阅Android硬件加速
最后,我通过在卡片视图中添加边距,可以在棒棒糖设备上获得阴影。 这是最终的cardview布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res/com.example.myapp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="@android:color/white" android:foreground="?android:attr/selectableItemBackground" android:layout_marginLeft="@dimen/activity_horizontal_margin" android:layout_marginRight="@dimen/activity_horizontal_margin" android:layout_marginTop="@dimen/padding_small" android:layout_marginBottom="@dimen/padding_small" app:cardCornerRadius="4dp" app:cardElevation="4dp" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin" > <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="@dimen/padding_small" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:textAppearance="?android:attr/textAppearanceLarge" /> <ImageView android:id="@+id/ivPicture" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tvName" android:layout_centerHorizontal="true" android:scaleType="fitCenter" /> <TextView android:id="@+id/tvDetail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ivPicture" android:layout_centerHorizontal="true" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" /> </RelativeLayout>
检查hardwareAccelerated在清单中使它成真,使它错误删除阴影,当虚假阴影出现在xml预览,但不是在手机。
你可以尝试join这一行
card_view:cardUseCompatPadding="true"
整个代码将会像这样
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="5dp" android:orientation="horizontal" card_view:cardUseCompatPadding="true" card_view:cardCornerRadius="5dp"> </android.support.v7.widget.CardView
您可以在卡片视图中为阴影添加此行代码
card_view:cardElevation="3dp"
下面你有一个例子
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="@android:color/white" android:foreground="?android:attr/selectableItemBackground" card_view:cardElevation="3dp" card_view:cardCornerRadius="4dp">
希望这可以帮助!
首先确保以下依赖关系在build.gradle文件中被正确添加和编译
dependencies { ... compile 'com.android.support:cardview-v7:21.0.+' }
并在此之后尝试下面的代码:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="5dp" android:orientation="horizontal" card_view:cardCornerRadius="5dp"> </android.support.v7.widget.CardView
在Android L的问题上升,因为没有添加layout_margin属性
在我的情况下,影子没有在Android L设备上显示,因为我没有添加保证金。 问题是,CardView自动在<5个设备上创build这个边距,所以现在我这样做:
CardView card = new CardView(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); if (Build.VERSION_CODES.LOLLIPOP == Build.VERSION.SDK_INT) { params.setMargins(shadowSize, shadowSize, shadowSize, shadowSize); } else { card.setMaxCardElevation(shadowSize); } card.setCardElevation(shadowSize); card.setLayoutParams(params);
只需添加此标签:
app:cardElevation="2dp" app:cardUseCompatPadding="true"
所以它成为:
<android.support.v7.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" app:cardBackgroundColor="?colorPrimary" app:cardCornerRadius="3dp" app:cardElevation="2dp" app:cardUseCompatPadding="true" app:contentPadding="1dp" />
在清单顶部移动您的“uses-sdk”属性,如下面的答案https://stackoverflow.com/a/27658827/1394139
我的recyclerview加载速度慢,所以通过阅读stackoverflow.com我改变了硬件加速到“假”,然后海拔没有显示在设备中。 我改回了真实。 这个对我有用。