Android Lollipop CardView的连锁反应

我试图获得一个CardView显示涟漪效应时,通过设置android:背景属性在活动XML文件中描述的在这里在android开发人员页面,但它不起作用。没有动画,但是onClick中的方法被调用。我还尝试创建一个ripple.xml文件在这里,但同样的结果。

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

<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开发相对陌生,所以我可能犯了一些明显的错误。

143895 次浏览

涟漪效应在您正在使用的appcompat支持库中被省略了。如果你想看到波纹,请使用Android L版本并在Android L设备上进行测试。根据AppCompat v7网站:

"为什么棒棒糖前没有波纹? 很多让RippleDrawable顺利运行的是Android 5.0的新RenderThread。为了优化之前Android版本的性能,我们暂时将RippleDrawable排除在外。" < / p >

查看这个链接在这里获取更多信息

你应该在CardView中添加以下内容:

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

我设法通过以下方法在cardview上获得涟漪效应:

<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,必须为lollipop(在drawable-v21包中)和prelollipop(在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>

对于可绘制包中的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>

在前棒棒糖设备上,你会有一个固定的点击效果在棒棒糖设备上,你会在卡片视图上有一个涟漪效应。

我对AppCompat并不满意,所以我编写了自己的CardView并反向移植了waves。这是在Galaxy S上运行的姜饼,所以这绝对是可能的。

 Galaxy S上的Ripple演示

有关更多详细信息,请检查源代码

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" />

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

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

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

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

从文档:

可点击的 -定义该视图是否响应单击事件。必须为布尔值,或"true"或“;false"。

前景 -定义在内容上绘制的可绘制对象。这可以用作覆盖。如果重力设置为填充,前景可绘制对象将参与内容的填充。

如果有一个根布局,比如RelativeLayout或LinearLayout,它包含了CardView中所有适配器项的组件,你必须在那个根布局中设置background属性。如:

<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>

对于那些寻找解决方案的涟漪效应的问题,不工作在编程创建的CardView(或在我的情况下,自定义视图扩展CardView)显示在一个RecyclerView,以下工作对我来说。基本上,在XML布局文件中声明其他答案中提到的XML属性似乎不适用于编程创建的CardView,或从自定义布局创建的CardView(即使根视图是CardView或使用merge元素),因此它们必须以编程方式设置如下:

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对于TypedArray部分的这个答案

对我来说,将foreground添加到CardView中不起作用(原因未知:/)

将相同的元素添加到它的子布局中就可以了。

代码:

<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>
  android:foreground="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"

只工作api 21和使用这个不使用这个列表行卡视图

添加这两个类似的代码工作就像一个魅力的任何视图,如按钮,线性布局,或CardView只要把这两行,看看魔法…

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

在xml中添加以下内容:

android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"

并添加到适配器(如果是您的情况)

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val attrs = intArrayOf(R.attr.selectableItemBackground)
val typedArray = holder.itemView.context.obtainStyledAttributes(attrs)
val selectableItemBackground = typedArray.getResourceId(0, 0)
typedArray.recycle()


holder.itemView.isClickable = true
holder.itemView.isFocusable = true
holder.itemView.foreground = holder.itemView.context.getDrawable(selectableItemBackground)
}
}

使用Material Cardview代替,它扩展了Cardview并提供了多个新功能,包括默认的可点击效果:

<com.google.android.material.card.MaterialCardView>


...


</com.google.android.material.card.MaterialCardView>

依赖关系(它可以使用到API 14来支持旧设备):

implementation 'com.google.android.material:material:1.0.0'

如果你想在(child) Card视图中添加任何元素,你可以使用:

<ImageView
android:background="?android:attr/selectableItemBackground"

但如果你需要整个卡视图,这样做:

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

如果你用两种颜色,颜色会比其他颜色深。

然而,最简单的方法是

com.google.android.material.card.MaterialCardView