Android—(實現仿網易新聞的頂部導航指示器)
阿新 • • 發佈:2018-12-18
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- private List<View> listViews;
- private ImageView cursorIv;
- private TextView tab01, tab02, tab03;
- private TextView[] titles;
- private ViewPager viewPager;
- /**
- * 偏移量(手機螢幕寬度 / 選項卡總數 - 選項卡長度) / 2
- */
- private int offset = 0;
- /**
- * 下劃線圖片寬度
- */
- private int lineWidth;
- /**
- * 當前選項卡的位置
- */
- private int current_index = 0;
- /**
- * 選項卡總數
- */
- private static final int TAB_COUNT = 3;
- private static final int TAB_0 = 0;
- private static final int TAB_1 = 1;
- private static final int TAB_2 = 2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initUI();
- initImageView();
- initVPager();
- }
- /**
- * 初始化佈局和監聽
- */
- private void initUI() {
- viewPager = (ViewPager) findViewById(R.id.vPager);
- cursorIv = (ImageView) findViewById(R.id.iv_tab_bottom_img);
- tab01 = (TextView) findViewById(R.id.tv01);
- tab02 = (TextView) findViewById(R.id.tv02);
- tab03 = (TextView) findViewById(R.id.tv03);
- tab01.setOnClickListener(this);
- tab02.setOnClickListener(this);
- tab03.setOnClickListener(this);
- }
- /**
- * 初始化底部下劃線
- */
- private void initImageView() {
- // 獲取圖片寬度
- lineWidth = BitmapFactory.decodeResource(getResources(), R.drawable.ic_orange_line).getWidth();
- // Android提供的DisplayMetrics可以很方便的獲取螢幕解析度
- DisplayMetrics dm = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dm);
- int screenW = dm.widthPixels; // 獲取解析度寬度
- offset = (screenW / TAB_COUNT - lineWidth) / 2; // 計算偏移值
- Matrix matrix = new Matrix();
- matrix.postTranslate(offset, 0);
- // 設定下劃線初始位置
- cursorIv.setImageMatrix(matrix);
- }
- /**
- * 初始化ViewPager並新增監聽事件
- */
- private void initVPager() {
- listViews = new ArrayList<>();
- LayoutInflater mInflater = getLayoutInflater();
- listViews.add(mInflater.inflate(R.layout.tab_01, null));
- listViews.add(mInflater.inflate(R.layout.tab_02, null));
- listViews.add(mInflater.inflate(R.layout.tab_03, null));
- viewPager.setAdapter(new MyPagerAdapter(listViews));
- viewPager.setCurrentItem(0);
- titles = new TextView[]{tab01, tab02, tab03};
- viewPager.setOffscreenPageLimit(titles.length);
- viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
- int one = offset * 2 + lineWidth;
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- }
- @Override
- public void onPageSelected(int position) {
- // 下劃線開始移動前的位置
- float fromX = one * current_index;
- // 下劃線移動完畢後的位置
- float toX = one * position;
- Animation animation = new TranslateAnimation(fromX, toX, 0, 0);
- animation.setFillAfter(true);
- animation.setDuration(500);
- // 給圖片新增動畫
- cursorIv.startAnimation(animation);
- // 當前Tab的字型變成紅色
- titles[position].setTextColor(Color.RED);
- titles[current_index].setTextColor(Color.BLACK);
- current_index = position;
- }
- @Override
- public void onPageScrollStateChanged(int state) {
- }
- });
- }
- /**
- * ViewPager介面卡
- */
- public class MyPagerAdapter extends PagerAdapter {
- public List<View> mListViews;
- public MyPagerAdapter(List<View> mListViews) {
- this.mListViews = mListViews;
- }
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- container.removeView(mListViews.get(position));
- }
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- container.addView(mListViews.get(position), 0);
- return mListViews.get(position);
- }
- @Override
- public int getCount() {
- return mListViews.size();
- }
- @Override
- public boolean isViewFromObject(View view, Object object) {
- return view == object;
- }
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.tv01:
- // 避免重複載入
- if (viewPager.getCurrentItem() != TAB_0) {
- viewPager.setCurrentItem(TAB_0);
- }
- break;
- case R.id.tv02:
- if (viewPager.getCurrentItem() != TAB_1) {
- viewPager.setCurrentItem(TAB_1);
- }
- break;
- case R.id.tv03:
- if (viewPager.getCurrentItem() != TAB_2) {
- viewPager.setCurrentItem(TAB_2);
- }
- break;
- }
- }
- }