Android RecyclerView所有特效全都在这 3分钟学完 悬浮 轮播画廊 拖拽动画

1.RecyclerView系列之一简单使用

2.RecyclerView系列之二ItemDecoration==========实现时间轴控件

3.RecyclerView系列之三自定义LayoutManager===实现滚轮翻页的效果。

5.RecyclerView系列之三自定义=================添加 侧滑删除,拖拽动画

6.RecyclerView系列之四实现回收复用 .嵌套滑动机制 和实现局部刷新 RecyclerView和listview的比较

7.RecycerView系列之六======================实现滚动画廊控件,轮播图的自定义控件 Gallery

8.RecyclerView实现============================ViewPager

9.RecyclerView添加HeaderView和FooterView========实现 上下滑联动

10.RecyclerView===============================打造悬浮顶部栏效果效果

 

Android RecyclerView所有特效全都在这 3分钟学完 悬浮 轮播画廊 拖拽动画_第1张图片

 

 

RecyclerView是什么

从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。RecyclerView的官方定义如下:

 

使用场景:

比如:有一个需求是屏幕竖着的时候的显示形式是ListView,屏幕横着的时候的显示形式是2列的GridView,此时如果用RecyclerView,则通过设置LayoutManager一行代码实现替换

 

使用

1.导入Support-v7包

implementation 'com.android.support:recyclerview-v7:21.0.3'

重要:一般写一个类继承 RecyclerView.ViewHolder

然后在class中继承 public class ViewAdapter extends RecyclerView.Adapter {

   static class ViewHolder extends RecyclerView.ViewHolder {

        View view;

        ImageView imageView;

        TextView textView;

 

        public ViewHolder(View itemView, int ivi, int tvi) {

            super(itemView);

            view=itemView;

            imageView=(ImageView) itemView.findViewById(ivi);

            textView=(TextView) itemView.findViewById(tvi);

        }

    }

}

 

2.当我们写一个Adapter的类派生自RecyclerView.Adapter时,最简单的形式是这样的:

public class RecyclerAdapter extends RecyclerView.Adapter {

    @Override

    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        return null;

    }

 

    @Override

    public void onBindViewHolder(ViewHolder holder, int position) {

 

    }

 

    @Override

    public int getItemCount() {

        return 0;

    }

}

public class ViewAdapter extends RecyclerView.Adapter {

    private Context context;

    private List datas;

    private int layoutResId;

    private int imageViewId;

    private int textViewId;

    private boolean isCenterCrop;

 

    public ViewAdapter(Context c, List list, int lri, int ivi, int tvi, boolean centerCrop) {

        context=c;

        datas=list;

        layoutResId=lri;

        imageViewId=ivi;

        textViewId=tvi;

        isCenterCrop=centerCrop;

    }

 

 

    @Override

    public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {

        View view= LayoutInflater.from(context).inflate(layoutResId, parent, false);

        return new ViewHolder(view, imageViewId, textViewId);

    }

 

    @Override

    public void onBindViewHolder(ViewHolder holder, final int position) {

        final Animal animal=datas.get(position);

        if(isCenterCrop)

            Glide.with(context).load(animal.getImgResId()).centerCrop().into(holder.imageView);

        else

            Glide.with(context).load(animal.getImgResId()).into(holder.imageView);

        holder.textView.setText(animal.getDescription());

        holder.view.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent=new Intent(context, DetailActivity.class);

                intent.putExtra("IMG_RES_ID", animal.getImgResId());

                intent.putExtra("DESCRIPTION", animal.getDescription());

                context.startActivity(intent);

            }

        });

        holder.view.setOnLongClickListener(new View.OnLongClickListener() {

            @Override

            public boolean onLongClick(View v) {

                Toast.makeText(context, "第"+position+"个元素", Toast.LENGTH_SHORT).show();

                return true;

            }

        });

    }

 

    @Override

    public int getItemCount() {

        return datas.size();

    }

 

    public void addItem(int position) {

        datas.add(position, ResourceUtils.getRandomAnimal());

        notifyItemInserted(position);

    }

 

    public void removeItem(int position) {

        if(position>=0 && position

            datas.remove(position);

            notifyItemRemoved(position);

        }

    }

 

    static class ViewHolder extends RecyclerView.ViewHolder {

        View view;

        ImageView imageView;

        TextView textView;

 

        public ViewHolder(View itemView, int ivi, int tvi) {

            super(itemView);

            view=itemView;

            imageView=(ImageView) itemView.findViewById(ivi);

            textView=(TextView) itemView.findViewById(tvi);

        }

    }

}

这里与listVIew唯一的区别是,这里需要设置一个LayoutManager对象,这里设置的是LinearLayoutManager,也就是垂直列表。我们知道Adapter的职责是用数据将每个Item的控件填充起来。而RecycerView与ListView不一样的是,它不仅能实现传统的滑动的列表,还能实现GridView和瀑布流造型,或者其它各式各样的特殊造型。而这些造型的实现就是通过LayoutManger来实现的,我们通过Adapter将Item填充了以后,那每个Item怎么摆放是由谁来做的呢?摆放Item的操作就是使用LayoutManager来实现出来的。所以每个LayoutManger所实现的摆放Item的方式都是不一样的,比如:LinearLayoutManager就是传统的ListView的功能,上下滚动或者左右滚动。而GridLayoutManager则是网格摆放,而StaggeredGridLayoutMnager则是瀑布流摆放。

 

到这里,我们就实现了本部分开头的上下滚动的效果了。

--------------------- 

1.RecyclerView分组效果 

2.添加华丽的分割线--装饰(时间轴控件)

自定义装饰

DividerItemDecoration mDivider = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);

mRecyclerView.addItemDecoration(mDivider);

那ItemDecoration与Item是什么关系呢?对于英语来讲,Decoration是装饰的意思

自定义:public class LinearItemDecoration extends RecyclerView.ItemDecoration

public class LinearItemDecoration extends RecyclerView.ItemDecoration {

    private Paint mPaint;

    private Bitmap mBmp;

    public LinearItemDecoration(Context context) {

        mPaint = new Paint();

        mPaint.setColor(Color.GREEN);

        BitmapFactory.Options options = new BitmapFactory.Options();

        options.inSampleSize = 2;

        mBmp = BitmapFactory.decodeResource(context.getResources(),R.mipmap.icon,options);

    }

    @Override

    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

        super.onDraw(c, parent, state);

        int childCount = parent.getChildCount();

        for (int i = 0; i < childCount; i++) {

            View child = parent.getChildAt(i);

            c.drawBitmap(mBmp,0,child.getTop(), mPaint);

        }

    }

    @Override

    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {

        super.onDrawOver(c, parent, state);

    }

    @Override

    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

        super.getItemOffsets(outRect, view, parent, state);

        outRect.left = 200;

        outRect.bottom = 1;

    }

}

 

Item Animator动画

RecyclerView能够通过mRecyclerView.setItemAnimator(ItemAnimator animator)设置添加、删除、移动、改变的动画效果

Item Animator动画

RecyclerView能够通过mRecyclerView.setItemAnimator(ItemAnimator animator)设置添加、删除、移动、改变的动画效果

RecyclerView提供了默认的ItemAnimator实现类:DefaultItemAnimator。如果没有特殊的需求,默认使用这个动画即可。

// 设置Item添加和移除的动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());



 

3.自定义LayoutManager :

自定义LayoutManager来制作第一个滚轮翻页的效果。

LayoutManager主要用于布局其中的Item,在LayoutManager中能够对每个Item的大小,位置进行更改,将它放在我们想要的位置,在很多优秀的效果中,都是通过自定义LayoutManager来实现的,比如:

自定义CustomLayoutManager

public class CustomLayoutManager extends LayoutManager {

    @Override

    public LayoutParams generateDefaultLayoutParams() {

        return null;

    }

}

 

先生成一个类CustomLayoutManager,派生自LayoutManager:

1.2 RecyclerView的回收复用原理

从上面的对比中可以看出,RecyclerView确实是存在回收复用的,但回收复用是需要我们在自定义的LayoutManager中处理的,而不是会自动具有这个功能,那么问题来了,我们要怎么给自定义的LayoutManager添加上回收复用功能呢?

在讲解自定义回收复用之前,我们需要先了解RecyclerView是如何处理回收复用的。

 

1.2.1 简述RecyclerView的回收复用原理

 

其实RecyclerView内部已经为我们实现了回收复用所必备的所有条件,但在LayoutManager中,我们需要写代码来标识每个holderView是否继续可用,还是要把它放在回收池里面去。很明显,我们在上面的实例代码中,我们只是通过layoutDecorated(……)来布局Item,而对已经滚出屏幕的HolderView没有做任何处理,更别说给他们添加已经被移除的标识了。所以我们写的CustomLayoutManager不能复用HolderView的原因也在这。下面我们来看看RecyclerView给我们已经做好了哪方面准备,我们先来整体理解下RecyclerView的回收复用原理,然后再写代码使我们的CustomLayoutManager具有回收复用功能。

--------------------- 

 

滚动画廊控件

 

RecycerView系列之六实现滚动画廊控件实现原理:

 

 

RecycerView系列之六实现滚动画廊控件实现步骤:

 

 

RecyclerView vs ListView

ListView相比RecyclerView,有一些优点

  • addHeaderView()addFooterView()添加头视图和尾视图。
  • 通过”android:divider”设置自定义分割线。
  • setOnItemClickListener()setOnItemLongClickListener()设置点击事件和长按事件。

这些功能在RecyclerView中都没有直接的接口,要自己实现(虽然实现起来很简单),因此如果只是实现简单的显示功能,ListView无疑更简单。

RecyclerView相比ListView,有一些明显的优点

  • 默认实现View复用,不需要类似if(convertView == null)的实现,而且回收机制更加完善。
  • 默认支持局部刷新
  • 容易实现添加item、删除item动画效果。
  • 容易实现拖拽、侧滑删除等功能。

RecyclerView是一个插件式的实现,对各个功能进行解耦,从而扩展性比较好。


 

RecyclerView实现局部刷新

RecyclerView提供了notifyItemInserted(),notifyItemRemoved(),notifyItemChanged()等API更新单个或某个范围的Item视图。

 

参考博客

https://blog.csdn.net/harvic880925/article/details/86606873

 

https://www.jianshu.com/p/4f9591291365

 

demo地址:

https://download.csdn.net/download/harvic880925/10933790

 

 

 

你可能感兴趣的:(view绘制滑动和动画,高级view)