整理自:
http://www.cnblogs.com/JohnTsai/p/4715454.html
直接切入正題,如果我們要實(shí)現(xiàn)下面這兩種效果該怎么做呢?
1
2
第一種效果還算比較簡(jiǎn)單拆讯,使用ViewPager再加上FragmentPagerAdapter就可以實(shí)現(xiàn)驯耻,其中,這其中最麻煩的就是tab下面那個(gè)導(dǎo)航條融击,需要根據(jù)屏幕大小以及標(biāo)簽個(gè)數(shù)來動(dòng)態(tài)設(shè)置其位置
而第二種效果除了導(dǎo)航條的位置的變換筑公,其長(zhǎng)度以及tab的位置都需要仔細(xì)地去考慮···真的是非常麻煩
之前一直想著自己能不能對(duì)這種效果進(jìn)行封裝,但是現(xiàn)在谷歌自己以及發(fā)布了一個(gè)庫-TabLayout尊浪,可以直接實(shí)現(xiàn)這樣的效果啦匣屡。這個(gè)TabLayout的具體知識(shí)就不在這說了,網(wǎng)上有很多資料拇涤。
最后附上如果是自己實(shí)現(xiàn)第一種那樣的效果怎么做:
因?yàn)樽约簩?shí)現(xiàn)不是我們這里的重點(diǎn)捣作,所以我就直接將代碼發(fā)上來就不解釋了
public class MySongFrag extends Fragment {
@BindView(R.id.view_pager)
ViewPager viewPager;
@BindView(R.id.tv_album)
TextView tvAlbum;
@BindView(R.id.tv_singer)
TextView tvSinger;
@BindView(R.id.tv_song)
TextView tvSong;
@BindView(R.id.iv_tab_line)
ImageView ivTabLine;
@BindView(R.id.layout_tab)
LinearLayout tabLayout;
ResourceUtils resourceUtils;
FragmentPagerAdapter fragmentPagerAdapter;
List<Fragment> fragmentList=new ArrayList<Fragment>();
//當(dāng)前顯示頁面的下標(biāo)
double currentIndex;
//屏幕寬度
double screenWidth;
//上面的那個(gè)tab的寬度,是屏幕寬度的六分之四
double tabWidth;
//屏幕寬度的六分之一
double sixInOne;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.frag_my_song,null);
ButterKnife.bind(this,view);
init();
initTabWidth();
initViewPager();
return view;
}
private void init() {
resourceUtils=new ResourceUtils(getActivity());
}
//設(shè)置上面tab寬度為屏幕寬度三分之二
private void initTabWidth() {
screenWidth=getActivity().getWindowManager().getDefaultDisplay().getWidth();
tabWidth=screenWidth*2/3;
sixInOne=screenWidth/6;
LinearLayout.LayoutParams lp= (LinearLayout.LayoutParams) tabLayout.getLayoutParams();
lp.width= (int) tabWidth;
tabLayout.setLayoutParams(lp);
LinearLayout.LayoutParams lpIv= (LinearLayout.LayoutParams) ivTabLine.getLayoutParams();
lpIv.width=(int) tabWidth/3;
lpIv.leftMargin=(int) sixInOne;
ivTabLine.setLayoutParams(lpIv);
}
private void initViewPager() {
SongFrag songFrag=new SongFrag();
SingerFrag singerFrag=new SingerFrag();
AlbumFrag albumFrag=new AlbumFrag();
fragmentList.add(songFrag);
fragmentList.add(singerFrag);
fragmentList.add(albumFrag);
fragmentPagerAdapter=new FragmentPagerAdapter(getFragmentManager()) {
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
};
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setCurrentItem(0);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) ivTabLine
.getLayoutParams();
/**
* 利用currentIndex(當(dāng)前所在頁面)和position(下一個(gè)頁面)以及offset來
* 設(shè)置mTabLineIv的左邊距 滑動(dòng)場(chǎng)景:
* 記3個(gè)頁面,
* 從左到右分別為0,1,2
* 0->1; 1->2; 2->1; 1->0
*/
if (currentIndex == 0 && position == 0)// 0->1
{
lp.leftMargin = (int) (sixInOne+positionOffset * (tabWidth * 1.0 / 3) + currentIndex
* (tabWidth / 3));
} else if (currentIndex == 1 && position == 0) // 1->0
{
lp.leftMargin = (int) (-(1 - positionOffset)
* (tabWidth * 1.0 / 3)+sixInOne + currentIndex
* (tabWidth / 3));
} else if (currentIndex == 1 && position == 1) // 1->2
{
lp.leftMargin = (int) (positionOffset * (tabWidth * 1.0 / 3) + sixInOne+currentIndex
* (tabWidth / 3));
} else if (currentIndex == 2 && position == 1) // 2->1
{
lp.leftMargin = (int) (-(1 - positionOffset)
* (tabWidth * 1.0 / 3) +sixInOne+ currentIndex
* (tabWidth / 3));
}
ivTabLine.setLayoutParams(lp);
}
@Override
public void onPageSelected(int position) {
resetTextView();
switch (position) {
case 0:
tvSong.setTextColor(resourceUtils.getColorIntRes(R.color.myColorAccent));
break;
case 1:
tvSinger.setTextColor(resourceUtils.getColorIntRes(R.color.myColorAccent));
break;
case 2:
tvAlbum.setTextColor(resourceUtils.getColorIntRes(R.color.myColorAccent));
break;
}
currentIndex = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void resetTextView() {
tvAlbum.setTextColor(resourceUtils.getColorIntRes(R.color.tab_text_unchecked));
tvSinger.setTextColor(resourceUtils.getColorIntRes(R.color.tab_text_unchecked));
tvSong.setTextColor(resourceUtils.getColorIntRes(R.color.tab_text_unchecked));
}
}