仿微博发现界面
先上效果图:
这里用到了 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);
}
}
}