如何让所有 View 都可以带上点击的水波纹效果

如题所述

第1个回答  2017-07-07

V2EX  ›  Android
如何让所有 View 都可以带上点击的水波纹效果?





AtlantisZ · 2015-11-12 23:49:00 +08:00
这是一个创建于 483 天前的主题,其中的信息可能已经有所发展或是发生改变。
根据 G官方文档 
定制触摸反馈 
材料设计中的触摸反馈可在用户与 UI 元素互动时,在接触点上提供即时视觉确认。适用于按钮的默认触摸动画使用全新 RippleDrawable 类别,以波纹效果实现不同状态间的转换。 

在大多数情况下,您应以下列方式指定视图背景,在您的视图 XML 中应用此功能: 

?android:attr/selectableItemBackground 指定有界的波纹 
?android:attr/selectableItemBackgroundBorderless 指定越界的波纹 
注意: selectableItemBackgroundBorderless 是 API 级别 21 中推出的新属性。 

此外,您可利用 ripple 元素将 RippleDrawable 定义为一个 XML 资源。 

您可以为 RippleDrawable 对象指定一种颜色。如果要改变默认触摸反馈颜色,请使用主题的 android:colorControlHighlight 属性。 


但是发现有时候一个 LinearLayout 设置 android:background="?android:attr/selectableItemBackground" 
就带上了水波纹效果,有的不行,,TextView 也是,设置 android:background="?android:attr/selectableItemBackground"有的带上了,有的不行. 


RecyclerView 的 Item layout 根布局加上了这个属性也无效果. 

后来辗转反侧,找到了 Stackflow 找到的回答,也不奏效. 
FrameLayout view = (FrameLayout) View.inflate(context, R.layout.item_top_news, null); 
RippleDrawable drawable = (RippleDrawable) mActivity.getResources() 
.getDrawable(R.drawable.ripple_background); 

view.setClickable(true); 
view.setForeground(drawable); 

求解如何实现 BiliBili MD 客户端,几乎每个 View 点击都有的水波纹效果.


波纹

attr

Android

drawable

12 回复  |  直到 2015-11-19 21:41:40 +08:00

1
little_cup   2015-11-13 00:04:55 +08:00
从设计的角度说,你不应该让所有的 View 都带上 Ripple 效果,只应该让可点击的元素带上。 
从程序的角度说,你无法让所有的 View 都带上 Ripple 效果,只能让拿到点击事件的元素带上。



2
AtlantisZ   2015-11-13 00:15:38 +08:00
@little_cup 额,我只是感觉很难有短文字叙述清楚问题,原来标题是如何让 RecyclerView 的子 Item 带上水波纹效果了.感觉太局限了. 
请问现在 RecyclerView 的子 Item 已经可以响应点击事件跳转 Activity 了,请问如何才能带上水波纹的点击效果.我在 Item 的 layout 根布局修改 android:background="?android:attr/selectableItemBackground"没有效果.



3
little_cup   2015-11-13 00:25:24 +08:00
@AtlantisZ 哪个 view 绑定 click 就给哪个设 selectableItemBackground 。当然注意不要被其他 view 在视觉上覆盖了。



4
AtlantisZ   2015-11-13 00:42:01 +08:00
在 onBindViewHolder 中 
TypedValue typedValue = new TypedValue(); 
mActivity.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, typedValue, true); 
Drawable background = getResources().getDrawable(typedValue.resourceId); 
// Drawable background = getResources().getDrawable(R.drawable.ripple_background); 
holder.rootView.setBackground(background); 
holder.rootView.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
startActivity(new Intent(getContext(), VideoDetailActivity.class)); 
// ToastUtils.showToast(mActivity, "av :: " + mRecommendList.get(position).av); 

}); 
还是没有用额.



5
AtlantisZ   2015-11-13 11:17:22 +08:00
@little_cup 

在 onBindViewHolder 中 
TypedValue typedValue = new TypedValue(); 
mActivity.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, typedValue, true); 
Drawable background = getResources().getDrawable(typedValue.resourceId); 
// Drawable background = getResources().getDrawable(R.drawable.ripple_background); 
holder.rootView.setBackground(background); 
holder.rootView.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
startActivity(new Intent(getContext(), VideoDetailActivity.class)); 

}); 
还是没有用额.



6
miao1007   2015-11-15 19:55:46 +08:00
这样写不会报错看 

ClassNoFound 这个错误在低 API 下会出现



7
ybjaychou   2015-11-17 20:53:35 +08:00
我也是在愁这个问题,同样是在 RecyclerView 的 Item 里面,不知道怎么才能有点击效果,就算不是水纹也可以啊。。 
顺便搭个车,就是怎么在 RecyclerView 里面做多选操作,然后 Toolbar 上面出现操作按钮,不知道有人做过没



8
ecmadao   2015-11-18 19:01:06 +08:00
同表示弄不出波纹点击效果,不知道是不是 SDK 版本的原因。 
目前暂时通过 github 上一个开源项目实现那个效果了。。 




9
ecmadao   2015-11-18 19:05:55 +08:00
@ybjaychou 
我自己是在 itemView 上加入了一个 checkBox ,平常处于隐藏状态,需要批量删除的适合,重新加载 RecyclerView 让 checkBox 显示。而 checkBox 的点击事件则是往一个数组里面扔 item 的 id ,那样就知道选了那些。 
toolbar 的改变的话可以通过 onPrepareOptionsMenu 和 invalidateOptionsMenu()来改变,当然也可以通过 ActionMode.Callback 来实现 
通过这种方法来实现的话需要对 checkBox 的点击进行标示优化,避免列表滑动的适合 checkBox 错误问题



10
ybjaychou   2015-11-19 12:52:08 +08:00 via Android
@ecmadao 好,谢谢,我试试!



11
AtlantisZ   2015-11-19 16:49:47 +08:00
@ybjaychou 
@ecmadao 

参考 解决了 RecyclerView 中 Item 无水波纹效果的问题额.



12
ecmadao   2015-11-19 21:41:40 +08:00
@AtlantisZ
THX!等下就去试试喽