先上效果图:
这里用到了 LayoutTransition动画,在我的博客中有一节专门介绍
public class MainActivity extends AppCompatActivity { //fragment的适配器 private MainTabFragmentAdapter mainTabFragmentAdapter; //viewpager private ViewPager mViewPager; //左上角的退出ICON private ImageView exit; //AppBarLayout private AppBarLayout mAppBarLayout; //顶部HeaderLayout private LinearLayout headerLayout,title5; //大头部标题的高度 int title5Height; //小头部的标题 private SmartTabLayout mTabs; //是否隐藏了头部 private boolean isHideHeaderLayout = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } //初始化方法 private void init(){ exit= (ImageView) findViewById(R.id.exit); title5= (LinearLayout) findViewById(R.id.title5); title5Height= title5.getMeasuredHeight(); mTabs = (SmartTabLayout) findViewById(R.id.tabs); mViewPager = (ViewPager) findViewById(R.id.viewpager); mainTabFragmentAdapter = new MainTabFragmentAdapter(getSupportFragmentManager(),this); mViewPager.setAdapter(mainTabFragmentAdapter); mTabs.setViewPager(mViewPager); mViewPager.setOffscreenPageLimit(mainTabFragmentAdapter.getCount()); headerLayout = (LinearLayout) findViewById(R.id.guanggao); initAppBarLayout(); exit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if ( isHideHeaderLayout ){ isHideHeaderLayout = false; ((MainTabFragment)mainTabFragmentAdapter.getFragments().get(0)).getRvList().scrollToPosition(0); headerLayout.setVisibility(View.VISIBLE); new Handler().postDelayed(new Runnable() { @Override public void run() { AppBarLayout.LayoutParams mParams = (AppBarLayout.LayoutParams) headerLayout.getLayoutParams(); mParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL| AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED); headerLayout.setLayoutParams(mParams); title5.setVisibility(View.VISIBLE); mTabs.setVisibility(View.GONE); } },300); }else { finish(); } } }); } // 初始化AppBarLayout private void initAppBarLayout(){ LayoutTransition mTransition = new LayoutTransition(); /** * 添加View时过渡动画效果 */ ObjectAnimator addAnimator = ObjectAnimator.ofFloat(null, "translationY", 0, 1.f). setDuration(mTransition.getDuration(LayoutTransition.APPEARING)); mTransition.setAnimator(LayoutTransition.APPEARING, addAnimator); //header layout height final int headerHeight = getResources().getDimensionPixelOffset(R.dimen.header_height)+title5Height; mAppBarLayout = (AppBarLayout) findViewById(R.id.appbar); mAppBarLayout.setLayoutTransition(mTransition); mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { verticalOffset = Math.abs(verticalOffset); if ( verticalOffset >= headerHeight ){ isHideHeaderLayout = true; //当偏移量超过顶部layout的高度时,我们认为他已经完全移动出屏幕了 new Handler().postDelayed(new Runnable() { @Override public void run() { title5.setVisibility(View.GONE); mTabs.setVisibility(View.VISIBLE); AppBarLayout.LayoutParams mParams = (AppBarLayout.LayoutParams) headerLayout.getLayoutParams(); mParams.setScrollFlags(0); headerLayout.setLayoutParams(mParams); headerLayout.setVisibility(View.GONE); } },100); } } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( keyCode == KeyEvent.KEYCODE_BACK ){ //监听返回键 if ( isHideHeaderLayout ){ isHideHeaderLayout = false; ((MainTabFragment)mainTabFragmentAdapter.getFragments().get(0)).getRvList().scrollToPosition(0); headerLayout.setVisibility(View.VISIBLE); new Handler().postDelayed(new Runnable() { @Override public void run() { AppBarLayout.LayoutParams mParams = (AppBarLayout.LayoutParams) headerLayout.getLayoutParams(); mParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL| AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED); headerLayout.setLayoutParams(mParams); title5.setVisibility(View.VISIBLE); mTabs.setVisibility(View.GONE); } },300); }else { finish(); } return true; } return super.onKeyDown(keyCode, event); } }MainTabFragment
public class MainTabFragment extends Fragment { public static MainTabFragment newInstance() { return new MainTabFragment(); } private RecyclerView mRvList; private View rootView; private TestRvAdapter adapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_main_tab,container,false); initWidget(); return rootView; } public void initWidget(){ adapter = new TestRvAdapter(getActivity()); mRvList = (RecyclerView) rootView.findViewById(R.id.rv_list); mRvList.setLayoutManager(new LinearLayoutManager(getActivity())); mRvList.setAdapter(adapter); } public RecyclerView getRvList(){ return mRvList; } }MainTabFragmentAdapte
public class MainTabFragmentAdapter extends FragmentStatePagerAdapter { public ArrayList<Fragment> fragments; public Context mContext; private String[] titles; public MainTabFragmentAdapter(FragmentManager fm, Context context) { super(fm); mContext = context; initFragments(); } public ArrayList<Fragment> getFragments() { return fragments; } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } private void initFragments() { titles = new String[]{ mContext.getResources().getString(R.string.test_1), mContext.getResources().getString(R.string.test_2), mContext.getResources().getString(R.string.test_3), mContext.getResources().getString(R.string.test_4), mContext.getResources().getString(R.string.test_5), }; fragments = new ArrayList<>(); for ( int i=0; i < titles.length; i++ ){ Fragment fragment = MainTabFragment.newInstance(); fragments.add(fragment); } } @Override public CharSequence getPageTitle(int position) { return titles[position]; } }TestRvAdapter
public class TestRvAdapter extends RecyclerView.Adapter<TestRvAdapter.TestViewHolder> { private Context context; public TestRvAdapter(Context context){ this.context = context; } @Override public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false); return new TestViewHolder(view); } @Override public void onBindViewHolder(TestViewHolder holder, int position) { // holder.tv_test.setText("测试数据" + position); } @Override public int getItemCount() { return 10; } class TestViewHolder extends RecyclerView.ViewHolder { //TextView tv_test; TestViewHolder(View itemView) { super(itemView); // tv_test = (TextView) itemView.findViewById(R.id.tv_test); } } }