V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AtlantisZ
V2EX  ›  Android

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

  •  
  •   AtlantisZ · 2015-11-12 23:49:00 +08:00 · 17796 次点击
    这是一个创建于 3334 天前的主题,其中的信息可能已经有所发展或是发生改变。
    根据 Google 官方文档
    定制触摸反馈
    材料设计中的触摸反馈可在用户与 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 点击都有的水波纹效果.
    12 条回复    2015-11-19 21:41:40 +08:00
    little_cup
        1
    little_cup  
       2015-11-13 00:04:55 +08:00
    从设计的角度说,你不应该让所有的 View 都带上 Ripple 效果,只应该让可点击的元素带上。
    从程序的角度说,你无法让所有的 View 都带上 Ripple 效果,只能让拿到点击事件的元素带上。
    AtlantisZ
        2
    AtlantisZ  
    OP
       2015-11-13 00:15:38 +08:00
    @little_cup 额,我只是感觉很难有短文字叙述清楚问题,原来标题是如何让 RecyclerView 的子 Item 带上水波纹效果了.感觉太局限了.
    请问现在 RecyclerView 的子 Item 已经可以响应点击事件跳转 Activity 了,请问如何才能带上水波纹的点击效果.我在 Item 的 layout 根布局修改 android:background="?android:attr/selectableItemBackground"没有效果.
    little_cup
        3
    little_cup  
       2015-11-13 00:25:24 +08:00
    @AtlantisZ 哪个 view 绑定 click 就给哪个设 selectableItemBackground 。当然注意不要被其他 view 在视觉上覆盖了。
    AtlantisZ
        4
    AtlantisZ  
    OP
       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);
    }
    });
    还是没有用额.
    AtlantisZ
        5
    AtlantisZ  
    OP
       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));
    }
    });
    还是没有用额.
    miao1007
        6
    miao1007  
       2015-11-15 19:55:46 +08:00
    这样写不会报错?

    ClassNoFound 这个错误在低 API 下会出现
    ybjaychou
        7
    ybjaychou  
       2015-11-17 20:53:35 +08:00
    我也是在愁这个问题,同样是在 RecyclerView 的 Item 里面,不知道怎么才能有点击效果,就算不是水纹也可以啊。。
    顺便搭个车,就是怎么在 RecyclerView 里面做多选操作,然后 Toolbar 上面出现操作按钮,不知道有人做过没
    ecmadao
        8
    ecmadao  
       2015-11-18 19:01:06 +08:00
    同表示弄不出波纹点击效果,不知道是不是 SDK 版本的原因。
    目前暂时通过 github 上一个开源项目实现那个效果了。。
    https://github.com/balysv/material-ripple
    ecmadao
        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 错误问题
    ybjaychou
        10
    ybjaychou  
       2015-11-19 12:52:08 +08:00 via Android
    @ecmadao 好,谢谢,我试试!
    AtlantisZ
        11
    AtlantisZ  
    OP
       2015-11-19 16:49:47 +08:00
    ecmadao
        12
    ecmadao  
       2015-11-19 21:41:40 +08:00
    @AtlantisZ
    THX!等下就去试试喽
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2572 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:39 · PVG 13:39 · LAX 21:39 · JFK 00:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.