美文网首页AndroidAndroid进阶移动开发
为什么我的Material Design程序点击时没有波纹扩散效

为什么我的Material Design程序点击时没有波纹扩散效

作者: 李斯维 | 来源:发表于2015-10-16 11:56 被阅读3709次

    这个问题是我在模仿Chessesquare项目的时候出现的,没想到这个还挺棘手的,主要是麻烦,有几个注意事项。

    这个问题困扰的时间还挺长,有时候就打算不去管它了,但是在今天却居然莫名其妙的解决了,总结起来就是几个问题是跟很多地方的代码有关,有一处代码不一样,就没有这种效果。

    其实这是一个关于RecyclerView的问题,当我们以前使用ListView的时候,系统默认会给设置一个点击时的按下效果,但是当我们使用RecyclerView时,若不设置每一个条目的背景时,那么在点击时就没有任何效果。本文是通过获取系统提供的背景资源来设置点击时的显示效果。在5.0以上,会出现波纹扩散的效果,而在以前的Android版本,就只是单单的背景色改变,效果就是在上面的库中展示的样子。

    上段里已经说明的这个问题的解决方式,那么下面就通过几个步骤来解决这个问题。不过解决不仅仅是通过改变背景资源,还有其他值得注意的地方。

    1,首先要注意主题格式:

    这里的话需要看一下关于5.0中的设计的颜色方案,以及style中的几个重要item:

    <style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimaryDark">@color/purple_600</item>
        <item name="colorPrimary">@color/purple_400</item>
        <item name="colorAccent">@color/purple_A400</item>
        <item name="android:windowBackground">@color/purple_100</item>
    </style>
    

    此处注意下面这张图(该图中给出了主题颜色的主要属性名):

    material_theme 主题颜色对应.png

    2,在加载layout的时候,需要给布局设置相同主题的背景资源id:

    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.check_item, viewGroup, false);
    TypedValue typedValue = new TypedValue();
    getActivity().getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
    view.setBackgroundResource(typedValue.resourceId);
    

    3,itemView必须要设置clickabletrue

    下面的就是整体的Adapter的代码,如果与下面的代码一致,那么这个效果就是有的:

    final RecyclerView view = (RecyclerView) inflater.inflate(R.layout.fragment_read,container, false);
    view.setLayoutManager(new LinearLayoutManager(getActivity()));
    view.setAdapter(new RecyclerView.Adapter() {
    
        class ViewHolder extends RecyclerView.ViewHolder {
            public TextView textView;
            public ViewHolder(View itemView) {
                super(itemView);
                textView = (TextView) itemView.findViewById(R.id.check_item_textview);
                }
            }
        
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext())
                        .inflate(R.layout.check_item, viewGroup, false);
            TypedValue typedValue = new TypedValue();
            getActivity().getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
            view.setBackgroundResource(typedValue.resourceId);
            return new ViewHolder(view);
        }
        
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
            ((ViewHolder)viewHolder).textView.setText("VIDEO");
            viewHolder.itemView.setClickable(true);
        }
        
        @Override
        public int getItemCount() {
            return 50;
        }
    });
    return view;
    

    另外,在使用RecyclerView的时候,其Adapter不建议使用匿名内部类,因为当你不这么做时,极有可能在后续的编码中获益。

    相关文章

      本文标题:为什么我的Material Design程序点击时没有波纹扩散效

      本文链接:https://www.haomeiwen.com/subject/fqcacttx.html