使用RecyclerView和CardView触摸反馈
我很想为我的开源库启用触摸反馈。
我创build了一个RecyclerView
和一个CardView
。 CardView
包含具有不同onClick
操作的不同区域。 现在,如果用户点击卡片中的任意位置,我很乐意触发Ripple效果,但是我无法实现此行为。
这是我的listitem,你也可以在GitHub上find它: https : //github.com/mikepenz/AboutLibraries/blob/master/library/src/main/res/layout/listitem_opensource.xml
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:background="@drawable/button_rect_normal"/> <LinearLayout android:padding="6dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:gravity="center_vertical" android:paddingLeft="8dp" android:paddingRight="8dp" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/libraryName" android:textColor="@color/title_openSource" android:textSize="@dimen/textSizeLarge_openSource" android:textStyle="normal" android:layout_width="0dp" android:layout_weight="5" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1"/> <TextView android:id="@+id/libraryCreator" android:textColor="@color/text_openSource" android:textStyle="normal" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="right" android:maxLines="2" android:textSize="@dimen/textSizeSmall_openSource"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:layout_marginTop="4dp" android:background="@color/dividerLight_openSource"/> <TextView android:id="@+id/libraryDescription" android:textSize="@dimen/textSizeSmall_openSource" android:textStyle="normal" android:textColor="@color/text_openSource" android:padding="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="20"> </TextView> <View android:id="@+id/libraryBottomDivider" android:layout_width="match_parent" android:layout_height="1px" android:layout_marginTop="4dp" android:background="@color/dividerLight_openSource"/> <LinearLayout android:id="@+id/libraryBottomContainer" android:gravity="center_vertical" android:paddingLeft="8dp" android:paddingTop="4dp" android:paddingRight="8dp" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/libraryVersion" android:textColor="@color/text_openSource" android:textStyle="normal" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="left" android:maxLines="1" android:textSize="@dimen/textSizeSmall_openSource"/> <TextView android:id="@+id/libraryLicense" android:textColor="@color/text_openSource" android:textStyle="normal" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="right" android:maxLines="1" android:textSize="@dimen/textSizeSmall_openSource"/> </LinearLayout> </LinearLayout>
onClick
设置在这个布局的三个部分。 libraryCreator
, libraryDescription
和libraryBottomContainer
。
我希望有人知道这里出了什么问题。
谢谢你的帮助。
假设你使用的材料/ Appcompat主题和棒棒糖,我得到这个工作,使CardView具有以下属性:
android:focusable="true" android:clickable="true" android:foreground="?android:attr/selectableItemBackground"
CardLayout只是ViewGroup的一个子类,所以设置:
android:background="?android:attr/selectableItemBackground"
应该做的伎俩。
更新:
(看起来像你正在尝试使用自定义波纹颜色。)
尝试使用自定义颜色作为背景可绘制的波纹(我没有使用过,所以我无法validation这种行为。)请参阅: 文档或这个问题 ,让你开始。
为了我:
android:background="?android:attr/selectableItemBackground"
终于工作了。 查看物品背后的recyclerView /内容背景,并查看与recyclerView一起使用的涟漪效应。
上面的答案都不适合我,或者太复杂了。
然后我意识到我必须在“RECYCLUDIEW ADAPTOR布局”中设置以下属性。
android:background="?android:attr/selectableItemBackground" android:focusable="true" android:clickable="true"
然后我把它工作。
我现在能够解决这个问题。
问题是我在TextViews上使用onClickListener,这个点击监听器阻止RippleForeground被通知触摸事件。 所以解决scheme是在这些TextView上实现一个TouchListener,并通过触摸事件。
这个课程非常简单,可以随处使用:
package com.mikepenz.aboutlibraries.util; import android.support.v7.widget.CardView; import android.view.MotionEvent; import android.view.View; /** * Created by mikepenz on 16.04.15. */ public class RippleForegroundListener implements View.OnTouchListener { CardView cardView; public RippleForegroundListener setCardView(CardView cardView) { this.cardView = cardView; return this; } @Override public boolean onTouch(View v, MotionEvent event) { // Convert to card view coordinates. Assumes the host view is // a direct child and the card view is not scrollable. float x = event.getX() + v.getLeft(); float y = event.getY() + v.getTop(); if (android.os.Build.VERSION.SDK_INT >= 21) { // Simulate motion on the card view. cardView.drawableHotspotChanged(x, y); } // Simulate pressed state on the card view. switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: cardView.setPressed(true); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: cardView.setPressed(false); break; } // Pass all events through to the host view. return false; } }
可以通过添加TouchListener来使用它:
RippleForegroundListener rippleForegroundListener = new RippleForegroundListener(); older.libraryCreator.setOnTouchListener(rippleForegroundListener);
此侦听器将仅通过触摸事件传递给CardView并触发正确的纹波效果。 (你也可以修改这个来获取任何视图,不应该仅限于CardView)
android:foreground="?android:attr/selectableItemBackground"
如果您使用前景而不是背景,则不需要使用可点击或可调焦的
在我的情况下,我需要显示自定义的背景和连锁反应。 所以我实现这一目标的方式是将这两个属性应用于我的回收商视图项目的根目录布局:
android:background="@drawable/custom_bg" android:foreground="?android:attr/selectableItemBackground"
和江一样有同样的问题:
我必须设置属性到布局文件,这是膨胀RecycleView。
我的主要布局:( 不要在这里添加属性!)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
我的RecycleViewAdapter:
View v = inflater.inflate(R.layout.list_center_item, parent, false);
我的list_center_item.xml( 在这里添加属性! )
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:background="?android:attr/selectableItemBackground" android:clickable="true" android:focusable="true" />
您必须在CardView
下使用的布局中添加以下行
android:clickable="true" android:focusable="true" android:background="@drawable/my_ripple"
例
<android.support.v7.widget.CardView android:layout_height="wrap_content" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:focusable="true" android:background="@drawable/my_ripple">