Android棒棒糖CardView上的波纹效果

我试图让CardView在触摸时通过在Android开发者页面上描述的activity activity XML文件中设置android:backgound属性来显示涟漪效应,但是它不起作用。 根本没有animation,但onClick中的方法被调用。 我也尝试创build一个ripple.xml文件,如同这里所build议的,但结果相同。

CardView出现在活动的XML文件中:

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="155dp" android:layout_height="230dp" android:elevation="4dp" android:translationZ="5dp" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" android:onClick="showNotices" android:background="?android:attr/selectableItemBackground" android:id="@+id/notices_card" card_view:cardCornerRadius="2dp"> </android.support.v7.widget.CardView> 

我对android开发比较陌生,所以我可能会犯一些明显的错误。
提前致谢。

您应该添加以下CardView

 android:foreground="?android:attr/selectableItemBackground" android:clickable="true" 

我设法通过以下方式获得卡片视图的连锁效果:

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:clickable="true" android:foreground="@drawable/custom_bg"/> 

而对于上面代码中可以看到的custom_bg,则必须为棒棒糖(在drawable-v21包中)和棒棒糖(在drawable包中)设备中定义一个xml文件。 对于drawable-v21包中的custom_bg,代码是:

 <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:attr/colorControlHighlight"> <item android:id="@android:id/mask" android:drawable="@android:color/white"/> </ripple> 

对于drawable包中的custom_bg,代码是:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape> <solid android:color="@color/colorHighlight"></solid> </shape> </item> <item> <shape> <solid android:color="@color/navigation_drawer_background"></solid> </shape> </item> </selector> 

所以在棒棒糖设备上,你会有一个坚实的点击效果,棒棒糖设备上,你将在卡片视图上产生连锁反应。

将这两行代码添加到您的xml视图中,以在cardView上产生连锁反应。

 android:clickable="true" android:foreground="?android:attr/selectableItemBackground" 

在你正在使用的appcompat支持库中省略了涟漪效应。 如果你想看到涟漪使用Android L版本,并在Android L设备上testing它。 根据AppCompat v7网站:

“为什么Lollipop之前没有任何涟漪?RippleDrawable能够stream畅运行的很多东西都是Android 5.0的新RenderThread。为了优化Android以前版本的性能,我们现在已经把RippleDrawable留下了。

看看这里的链接了解更多信息

如果您正在使用的应用程序minSdkVersion是9级,则可以使用:

 android:foreground="?selectableItemBackground" android:clickable="true" 

相反,从11级开始,你使用:

 android:foreground="?android:attr/selectableItemBackground" android:clickable="true" 

从文档:

可点击 – 定义此视图是否对点击事件作出反应。 必须是一个布尔值,“true”或“false”。

前景 – 定义drawable来绘制内容。 这可以用作覆盖。 如果重力设置为填充,则前景可绘制参与内容的填充。

Android Cardview控件的纹波事件:

 <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:foreground="?android:attr/selectableItemBackground" android:clickable="true" android:layout_marginBottom="4dp" android:layout_marginTop="4dp" > </android.support.v7.widget.CardView> 

如果在CardView中有一个像RelativeLayout或LinearLayout这样的包含所有适配器项目组件的根布局,则必须在该根布局中设置背景属性。 喜欢:

 <android.support.v7.widget.CardView 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" android:layout_width="match_parent" android:layout_height="122dp" android:layout_marginBottom="6dp" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" card_view:cardCornerRadius="4dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/touch_bg"/> </android.support.v7.widget.CardView> 

我对AppCompat不满意,所以我写了自己的CardView和backported涟漪。 这里是用Gingerbread在Galaxy S上运行的,所以这绝对有可能。

在这里输入图像描述

有关更多详情,请查看演示 。

对于那些寻找涟漪效应问题的解决scheme,而不是在程序创build的CardView(或者在我的情况下扩展CardView的自定义视图)在RecyclerView中显示的工作,以下为我工作。 基本上在XML布局文件中声明性地声明其他答案中提到的XML属性对于以编程方式创build的CardView或从自定义布局创build的CardView(即使根视图是CardView或使用合并元素)似乎都不起作用,所以他们必须像这样编程设置:

 private class MadeUpCardViewHolder extends RecyclerView.ViewHolder { private MadeUpCardView cardView; public MadeUpCardViewHolder(View v){ super(v); this.cardView = (MadeUpCardView)v; // Declaring in XML Layout doesn't seem to work in RecyclerViews if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int[] attrs = new int[]{R.attr.selectableItemBackground}; TypedArray typedArray = context.obtainStyledAttributes(attrs); int selectableItemBackground = typedArray.getResourceId(0, 0); typedArray.recycle(); this.cardView.setForeground(context.getDrawable(selectableItemBackground)); this.cardView.setClickable(true); } } } 

MadeupCardView extends CardView Kudos MadeupCardView extends CardViewTypedArray部分的答案 。

对我来说,添加CardViewforeground不起作用(原因未知:/)

把它添加到它的子布局做的伎俩。

码:

 <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:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:focusable="true" android:clickable="true" card_view:cardCornerRadius="@dimen/card_corner_radius" card_view:cardUseCompatPadding="true"> <LinearLayout android:id="@+id/card_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:foreground="?android:attr/selectableItemBackground" android:padding="@dimen/card_padding"> </LinearLayout> </android.support.v7.widget.CardView>