介绍
这篇文章主要介绍了如何使用Android实现知乎选项卡动态隐藏效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
<强>前言强>
因为最近手上项目也是资讯阅读类,简书,掘金,知乎的效果都想往项目上加,没事就来仿写。
<李>
列表上拉,选项卡隐藏,下滑出现;recycleView滚动监听(OnScrollListener)中onScrolled方法的dy参数,dy> 0表示上拉,dy<0表示下滑,刚好合适。
李> <李>选项卡怎么隐藏呢,属性动画,移动选项卡的相对位置View.TRANSLATION_Y (Y轴方向移动肯定是_Y吗),视图。翻译系列都是相对运动,参考系原是视图本的位置。
李> <李>还有个问题,对于选项卡来说,它需要的显隐时机是列表滑动方向改变,而不是只监听它的滑动;上拉改下,滑下滑改上拉这2个时机才能执行动画,不能在列表同一方向持续滚动时重复调用动画。
李><强>步骤:强>
要写多少代码呢? fragmeng中一个recycleView的监听要写,一个接口要写;活动中接口实现。没了,代码不多。
片段:
public interface RvScrollListener { ,//滑动方向监听 ,void scrollType (boolean 方向); ,//是否滑动到顶部监听 ,void inTop (boolean 顶部,RecyclerView recyclerView); } 时间=private RecyclerView.OnScrollListener  mOnScrollListener new RecyclerView.OnScrollListener (), { ,@Override ,public void  onScrollStateChanged (RecyclerView recyclerView, int newState), { super.onScrollStateChanged才能(recyclerView, newState); if 才能;(fragmentposition !=, 0), { ,,//如果不是第一个片段则返回 ,才能回报; ,,} LinearLayoutManager 才能;layoutManager =, (LinearLayoutManager), recyclerView.getLayoutManager ();//得才能到当前列表第一个完全显示的物品的位置 int 才能;position =, layoutManager.findFirstCompletelyVisibleItemPosition (); if 才能;(position ==, 0), { ,,//如果位置为0表示列表正处于顶部 ,,mRvScrollListener.inTop(真的,,recyclerView); ,,},{else ,,mRvScrollListener.inTop(假,recyclerView); ,,} ,} ,@Override ,public void  onScrolled (RecyclerView recyclerView, int dx, int dy), { super.onScrolled才能(recyclerView, dx, dy);//才能判断滑动方向,recycleView item 上拉,下滑不同动画 if 才能;(dy 祝辞,0),{ ,,isUp =,真的; ,,},{else ,,isUp =,假; ,,} if 才能;(fragmentposition !=, 0), { ,才能回报; ,,//如果不是第一个片段则返回 ,,}//才能过滤掉一些缓慢的滑动 if 才能;(Math.abs (dy),祝辞,10),{ ,,//滑动方向 ,,mRvScrollListener.scrollType (dy 祝辞,0); ,,} ,} };
recycleView第一个监听方法:
@Override public void  onScrollStateChanged (RecyclerView recyclerView, int newState), {}
这个里面就做一件事情,判断当前recycleView是否滑动到顶部,然后通过接口传递到活动中,当点回击键时,如果不在顶部,则调用方法滚动到顶部。
recycleView第二个监听方法:
@Override public void  onScrolled (RecyclerView recyclerView, int dx, int dy), {}
做2件事,一是recyleView的项目做动画时,因为上拉和下滑动画不一样,代码中isUp就是用来区分上拉下滑的((给recycleView的项目做加载动画使用)),
二是判断滑动方向,接口传递到活动中。
活动:
//上拉状态=private boolean  hasup 真实;//下滑状态=private boolean  hasdown 真实;//是否在顶部=private boolean  inTop 真实;//从片段传递过来的recycleView private RecyclerView  topRecyclerView; BlankFragment.RvScrollListener mRvScrollListener =, new BlankFragment.RvScrollListener (), { ,@Override ,public void  scrollType (boolean 方向),{//才能上拉 if 才能;(方向),{ ,,hasdown =,真的; ,,//连续上拉,第一次有效 ,,if (hasup), { ,,,ObjectAnimator.ofFloat (mTablayout, View.TRANSLATION_Y,, mTablayout.getTranslationY (),, PixelChange.dp2px (XjwTablayoutActivity.this, 50)) .setDuration (400) .start (); ,,,hasup =,假; ,,} ,,},else {//下滑 ,,hasup =,真的; ,,//连续下滑,第一次有效 ,,if (hasdown), { ,,,ObjectAnimator.ofFloat (mTablayout, View.TRANSLATION_Y,, mTablayout.getTranslationY (),, 0) .setDuration (400) .start (); ,,,hasdown =,假; ,,} ,,} ,} ,@Override ,public void  inTop (boolean ,, RecyclerView recyclerView), { 时间=inTop 才能;最高; 时间=topRecyclerView 才能;recyclerView; ,} }; @Override null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null如何使用Android实现知乎选项卡动态隐藏效果