自定义Recyalerview 折叠效果

这些都是通过在网上找到的方法和群里大神的帮助写的一个动画列表 这个列表并没什么特别难点,只不过我把这些融合在一起 方便一次性找到 不用挨个百度 。

这里做的是一个两列的recyaliview 单列的比较简单  下面这段代码应该可以用 还没有尝试过 如果有问题可以下方留言 我在做修改px:我们不生产代码,我们只是代码的搬运工。

简介:自定义Recyalerview 折叠效果

adapter里面的图片使用自定义的imagview VR效果

MyItemTouchCallback 制作拖动效果

首先自定义RecyclerView  这个只是为了达到折叠

 
  1. //自定义view

  2. public class ParallaxRecyclerView extends RecyclerView {

  3.  
  4. public ParallaxRecyclerView(Context context) {

  5. this(context, null);

  6. }

  7.  
  8. public ParallaxRecyclerView(final Context context, @Nullable AttributeSet attrs) {

  9. super(context, attrs);

  10.  
  11. if (isInEditMode()) {

  12. return;

  13. }

  14.  
  15. setLayoutManager(new LinearLayoutManager(context));

  16.  
  17. addItemDecoration(new ItemDecoration() {

  18. @Override

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

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

  21. //获取当前项的下标

  22. final int currentPosition = parent.getChildLayoutPosition(view);

  23. //获取最后一项的下标

  24. final int lastPosition = state.getItemCount() - 1;

  25. if (currentPosition != lastPosition) {

  26. outRect.bottom = -dp2px(context, 10);

  27. }

  28. }

  29. });

  30.  
  31. addOnScrollListener(new OnScrollListener() {

  32. @Override

  33. public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

  34. super.onScrollStateChanged(recyclerView, newState);

  35. }

  36.  
  37. @Override

  38. public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

  39. super.onScrolled(recyclerView, dx, dy);

  40. // final GridLayoutManager layoutManager = new GridLayoutManager(getActivity(),2);

  41. GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();

  42. int firstPosition = layoutManager.findFirstVisibleItemPosition();

  43. int lastPosition = layoutManager.findLastVisibleItemPosition();

  44. int visibleCount = lastPosition - firstPosition;

  45. //重置控件的位置及高度

  46. int elevation = 2;

  47. for (int i = firstPosition - 1; i <= (firstPosition + visibleCount) + 1; i++) {

  48. View view = layoutManager.findViewByPosition(i);

  49. if (view != null) {

  50. if (view instanceof CardView) {

  51. firstPosition ++;

  52. ((CardView) view).setCardElevation(dp2px(context, elevation));

  53. elevation += 5;

  54. }

  55. float translationY = view.getTranslationY();

  56. if (i > firstPosition && translationY != 0) {

  57. view.setTranslationY(0);

  58. }

  59. }

  60. }

  61.  
  62. View firstView = layoutManager.findViewByPosition(firstPosition);

  63. if (firstView != null) {

  64. float firstViewTop = firstView.getTop();

  65. firstView.setTranslationY(-firstViewTop / 2.0f);

  66. }

  67. //这里这段 如果不是两列的可以删掉

  68. View firstViews = layoutManager.findViewByPosition(firstPosition+1);

  69. if (firstViews != null) {

  70. float firstViewTop = firstViews.getTop();

  71. firstViews.setTranslationY(-firstViewTop / 2.0f);

  72. }

  73. }

  74. });

  75. }

  76.  
  77. private int dp2px(Context context, float dipValue) {

  78. final float scale = context.getResources().getDisplayMetrics().density;

  79. return (int) (dipValue * scale + 0.5f);

  80. }

  81.  
  82. }

集成进来 大家就会发现  滑动列表时候最上面的两条item有个折叠效果,网站有很多例子 这个 特别的就是集成了一个两列的  得到群里一个大神的帮助写出来的 ,本人表示这些代码根本看不懂!

接下来是vr效果 首先拿 也是集成一个自定义view 

这个控件继承了 picasso的效果 附带集成代码,dome上使用的比较旧 打包的时候出错了 下面是最新的picasso 

compile 'com.squareup.picasso:picasso:2.5.2'
 
  1. /**

  2. * 创建时间: 2018/01/12 12:13 <br>

  3. * 作者: jiangye <br>

  4. * 描述: 可随陀螺仪滑动的自定义 ImageView 控件

  5. */

  6. //以上是作者的名字

  7. public class GyroscopeImageView extends ImageView {

  8.  
  9. private double mScaleX;

  10. private double mScaleY;

  11. private float mLenX;

  12. private float mLenY;

  13. protected double mAngleX;

  14. protected double mAngleY;

  15. private float mOffsetX;

  16. private float mOffsetY;

  17.  
  18. public GyroscopeImageView(Context context) {

  19. super(context);

  20. init();

  21. }

  22.  
  23. public GyroscopeImageView(Context context, @Nullable AttributeSet attrs) {

  24. super(context, attrs);

  25. init();

  26. }

  27.  
  28. public GyroscopeImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

  29. super(context, attrs, defStyleAttr);

  30. init();

  31. }

  32.  
  33. private void init() {

  34. setScaleType(ScaleType.CENTER);

  35. }

  36.  
  37. @Override

  38. public void setScaleType(ScaleType scaleType) {

  39. super.setScaleType(ScaleType.CENTER);

  40. }

  41.  
  42. public float getOffsetX() {

  43. return mOffsetX;

  44. }

  45.  
  46. public float getOffsetY() {

  47. return mOffsetY;

  48. }

  49.  
  50. @Override

  51. protected void onAttachedToWindow() {

  52. super.onAttachedToWindow();

  53. GyroscopeManager gyroscopeManager = GyroscopeManager.getInstance();

  54. if (gyroscopeManager != null) {

  55. gyroscopeManager.addView(this);

  56. }

  57. }

  58.  
  59. @Override

  60. protected void onDetachedFromWindow() {

  61. super.onDetachedFromWindow();

  62. GyroscopeManager gyroscopeManager = GyroscopeManager.getInstance();

  63. if (gyroscopeManager != null) {

  64. gyroscopeManager.removeView(this);

  65. }

  66. }

  67.  
  68. public void update(double scaleX, double scaleY) {

  69. mScaleX = scaleX;

  70. mScaleY = scaleY;

  71. invalidate();

  72. }

  73.  
  74. @Override

  75. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

  76. super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  77. int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();

  78. int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();

  79. if (getDrawable() != null) {

  80. int drawableWidth = getDrawable().getIntrinsicWidth();

  81. int drawableHeight = getDrawable().getIntrinsicHeight();

  82. mLenX = Math.abs((drawableWidth - width) * 0.5f);

  83. mLenY = Math.abs((drawableHeight - height) * 0.5f);

  84. }

  85. }

  86.  
  87. @Override

  88. protected void onDraw(Canvas canvas) {

  89. if (getDrawable() == null || isInEditMode()) {

  90. super.onDraw(canvas);

  91. return;

  92. }

  93. mOffsetX = (float) (mLenX * mScaleX);

  94. mOffsetY = (float) (mLenY * mScaleY);

  95. canvas.save();

  96. canvas.translate(mOffsetX, mOffsetY);

  97. super.onDraw(canvas);

  98. canvas.restore();

  99. }

  100.  
  101. @Override

  102. public boolean equals(Object obj) {

  103. return super.equals(obj);

  104. }

  105.  
  106. @Override

  107. public int hashCode() {

  108. return super.hashCode();

  109. }

  110. }

引用自定义view就不bb了 然后就是每个time的显示imagview的代码  其实这个可以用你原本写的显示图片的的代码 只不过使用picasso可控制里面可以控制图片的大小,有些从网络上获取的参数图片大小不一样 如果不进行拉伸或者缩小 效果会很差,transform里面就是给图片固定的宽高  不管图片多大 都把图片的宽高写死 ps:VR效果根据图片的宽高做的效果 只要不小于view就可以显示效果  

我这边是用的这个控件 不懂就去百度  

int displayHeight = DeviceDimensionsHelper.getDisplayWidth(iv_cover.getContext());
 
  1. Picasso.with(context)

  2. .load(item.getCover())

  3. //这里宽高 ,别无脑复制 (w,h)

  4. .transform(new GyroscopeTransFormation(displayHeight / 2 - 20, displayHeight / 2 - 20))

  5. .into(iv_cover);

ok!运行 晃动下手机 !是不是炫

 

下面在做拖动效果 这个比上面的稍微复杂一点   你们只需要耐心的看完我的BB就可以继承进来 

首先 写adapter 这个用过rv的同学都有基础 因为我项目的adapter是自定义的 解释起来比较麻烦,所以只给部分需要的代码 ,你们就按照你们的rv开始写 

首先

final GridLayoutManager layoutManager = new GridLayoutManager(getActivity(),2);//两列
mRecyclerView.setLayoutManager(layoutManager);//继承两列
mRecyclerView.setItemAnimator(new DefaultItemAnimator());//嘿嘿 

在添加数据后 setadapter前添加

 
  1. MyItemTouchCallback callback = new MyItemTouchCallback(mHomeAdapter);

  2. ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);

  3. itemTouchHelper.attachToRecyclerView(mRecyclerView);

MyItemTouchCallback

 
  1. public class MyItemTouchCallback extends ItemTouchHelper.Callback {

  2. https://tieba.baidu.com/p/5823807858
  3. private HomeAdapter<IndexListBean.DataBean> adapter;

  4. https://tieba.baidu.com/p/5823810338
  5. private int mBackgroundColor = Color.WHITE;

  6. private int mDragcolor = Color.parseColor("#f5f5f5");

  7. https://tieba.baidu.com/p/5823813513
  8. public MyItemTouchCallback(HomeAdapter<IndexListBean.DataBean> adapter){

  9. this.adapter = adapter;

  10. }https://tieba.baidu.com/p/5823817041

  11.  
  12. @Override

  13. public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

  14. if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {

  15. final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;

  16. final int swipeFlags = 0;

  17. return makeMovementFlags(dragFlags, swipeFlags);

  18. } else {

  19. final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;

  20. //final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;

  21. final int swipeFlags = 0;

  22. return makeMovementFlags(dragFlags, swipeFlags);

  23. https://tieba.baidu.com/p/5823817879

  24.  

  25. @Override

  26. public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

  27. https://tieba.baidu.com/p/5823820381

  28. int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position

  29. int toPosition = target.getAdapterPosition();//得到目标ViewHolder的position

  30. adapter.onMove(fromPosition,toPosition);

  31. return true;

  32. }

  33. https://tieba.baidu.com/p/5823824205
  34. @Override

  35. public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

  36. int position = viewHolder.getAdapterPosition();

  37. adapter.onSwiped(position);

  38. }

  39. https://tieba.baidu.com/p/5823828875
  40. @Override

  41. public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

  42. if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {

  43. // 滑动时改变Item的透明度

  44. final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();

  45. viewHolder.itemView.setAlpha(alpha);

  46. viewHolder.itemView.setTranslationX(dX);

  47. } else {

  48. super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

  49. https://tieba.baidu.com/p/5823829350

  50. https://tieba.baidu.com/p/5823829570

  51. @Override

  52. public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {

  53. if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {

  54. viewHolder.itemView.setBackgroundColor(mDragcolor);

  55. }

  56. super.onSelectedChanged(viewHolder, actionState);

  57. }

  58.  
  59. @Override

  60. public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

  61. super.clearView(recyclerView, viewHolder);

  62. viewHolder.itemView.setAlpha(1.0f);

  63. viewHolder.itemView.setBackgroundColor(mBackgroundColor);

  64. }

  65.  
  66. /**

  67. * 设置普通状态的背景色

  68. * @param backgroundColor

  69. */

  70. public void setBackgroundColor(int backgroundColor){

  71. mBackgroundColor = backgroundColor;

  72. }

  73.  
  74. /**

  75. * 设置被拖动时候的背景色

  76. * @param dragcolor

  77. */

  78. public void setDragcolor(int dragcolor){

  79. mDragcolor = dragcolor;

  80. }

  81.  
  82.  
  83.  
  84. }

在这个关联的adapter里面添加抽象类 

implements DragMethod

DragMethod

 
  1. public interface DragMethod {

  2. public void onMove(int fromPosition, int toPosition);

  3. public void onSwiped(int position);

  4. }

在adapter里面添加代码

 
  1. @Override

  2. public void onMove(int fromPosition, int toPosition) {

  3. if (fromPosition == mData.size() - 1 || toPosition == mData.size() - 1) {

  4. return;

  5. }

  6. if (fromPosition < toPosition) {

  7. for (int i = fromPosition; i < toPosition; i++) {

  8. Collections.swap(mData, i, i + 1);

  9. }

  10. } else {

  11. for (int i = fromPosition; i > toPosition; i--) {

  12. Collections.swap(mData, i, i - 1);

  13. }

  14. }

  15. notifyItemMoved(fromPosition, toPosition);

  16. }

  17.  
  18. @Override

  19. public void onSwiped(int position) {

  20. mData.remove(position);

  21. notifyItemRemoved(position);

  22. }

  23.  
  24. @Override

  25. public int getItemCount() {

  26. return mData.size();

  27. }

ok  运行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值