1. 程式人生 > >Android—(實現仿網易新聞的頂部導航指示器)

Android—(實現仿網易新聞的頂部導航指示器)

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {  
  2.     private List<View> listViews;  
  3.     private ImageView cursorIv;  
  4.     private TextView tab01, tab02, tab03;  
  5.     private TextView[] titles;  
  6.     private ViewPager viewPager;  
  7.     /** 
  8.      * 偏移量(手機螢幕寬度 / 選項卡總數 - 選項卡長度) / 2 
  9.      */  
  10.     private int offset = 0;  
  11.     /** 
  12.      * 下劃線圖片寬度 
  13.      */  
  14.     private int lineWidth;  
  15.     /** 
  16.      * 當前選項卡的位置 
  17.      */  
  18.     private int current_index = 0;  
  19.     /** 
  20.      * 選項卡總數 
  21.      */  
  22.     private static final int TAB_COUNT = 3;  
  23.     private static final int TAB_0 = 0;  
  24.     private static final int TAB_1 = 1;  
  25.     private static final int TAB_2 = 2;  
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.         initUI();  
  31.         initImageView();  
  32.         initVPager();  
  33.     }  
  34.     /** 
  35.      * 初始化佈局和監聽 
  36.      */  
  37.     private void initUI() {  
  38.         viewPager = (ViewPager) findViewById(R.id.vPager);  
  39.         cursorIv = (ImageView) findViewById(R.id.iv_tab_bottom_img);  
  40.         tab01 = (TextView) findViewById(R.id.tv01);  
  41.         tab02 = (TextView) findViewById(R.id.tv02);  
  42.         tab03 = (TextView) findViewById(R.id.tv03);  
  43.         tab01.setOnClickListener(this);  
  44.         tab02.setOnClickListener(this);  
  45.         tab03.setOnClickListener(this);  
  46.     }  
  47.     /** 
  48.      * 初始化底部下劃線 
  49.      */  
  50.     private void initImageView() {  
  51.         // 獲取圖片寬度  
  52.         lineWidth = BitmapFactory.decodeResource(getResources(), R.drawable.ic_orange_line).getWidth();  
  53.         // Android提供的DisplayMetrics可以很方便的獲取螢幕解析度  
  54.         DisplayMetrics dm = new DisplayMetrics();  
  55.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  56.         int screenW = dm.widthPixels; // 獲取解析度寬度  
  57.         offset = (screenW / TAB_COUNT - lineWidth) / 2;  // 計算偏移值  
  58.         Matrix matrix = new Matrix();  
  59.         matrix.postTranslate(offset, 0);  
  60.         // 設定下劃線初始位置  
  61.         cursorIv.setImageMatrix(matrix);  
  62.     }  
  63.     /** 
  64.      * 初始化ViewPager並新增監聽事件 
  65.      */  
  66.     private void initVPager() {  
  67.         listViews = new ArrayList<>();  
  68.         LayoutInflater mInflater = getLayoutInflater();  
  69.         listViews.add(mInflater.inflate(R.layout.tab_01, null));  
  70.         listViews.add(mInflater.inflate(R.layout.tab_02, null));  
  71.         listViews.add(mInflater.inflate(R.layout.tab_03, null));  
  72.         viewPager.setAdapter(new MyPagerAdapter(listViews));  
  73.         viewPager.setCurrentItem(0);  
  74.         titles = new TextView[]{tab01, tab02, tab03};  
  75.         viewPager.setOffscreenPageLimit(titles.length);  
  76.         viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
  77.             int one = offset * 2 + lineWidth;  
  78.             @Override  
  79.             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
  80.             }  
  81.             @Override  
  82.             public void onPageSelected(int position) {  
  83.                 // 下劃線開始移動前的位置  
  84.                 float fromX = one * current_index;  
  85.                 // 下劃線移動完畢後的位置  
  86.                 float toX = one * position;  
  87.                 Animation animation = new TranslateAnimation(fromX, toX, 0, 0);  
  88.                 animation.setFillAfter(true);  
  89.                 animation.setDuration(500);  
  90.                 // 給圖片新增動畫  
  91.                 cursorIv.startAnimation(animation);  
  92.                 // 當前Tab的字型變成紅色  
  93.                 titles[position].setTextColor(Color.RED);  
  94.                 titles[current_index].setTextColor(Color.BLACK);  
  95.                 current_index = position;  
  96.             }  
  97.             @Override  
  98.             public void onPageScrollStateChanged(int state) {  
  99.             }  
  100.         });  
  101.     }  
  102.     /** 
  103.      * ViewPager介面卡 
  104.      */  
  105.     public class MyPagerAdapter extends PagerAdapter {  
  106.         public List<View> mListViews;  
  107.         public MyPagerAdapter(List<View> mListViews) {  
  108.             this.mListViews = mListViews;  
  109.         }  
  110.         @Override  
  111.         public void destroyItem(ViewGroup container, int position, Object object) {  
  112.             container.removeView(mListViews.get(position));  
  113.         }  
  114.         @Override  
  115.         public Object instantiateItem(ViewGroup container, int position) {  
  116.             container.addView(mListViews.get(position), 0);  
  117.             return mListViews.get(position);  
  118.         }  
  119.         @Override  
  120.         public int getCount() {  
  121.             return mListViews.size();  
  122.         }  
  123.         @Override  
  124.         public boolean isViewFromObject(View view, Object object) {  
  125.             return view == object;  
  126.         }  
  127.     }  
  128.     @Override  
  129.     public void onClick(View v) {  
  130.         switch (v.getId()) {  
  131.             case R.id.tv01:  
  132.                 // 避免重複載入  
  133.                 if (viewPager.getCurrentItem() != TAB_0) {  
  134.                     viewPager.setCurrentItem(TAB_0);  
  135.                 }  
  136.                 break;  
  137.             case R.id.tv02:  
  138.                 if (viewPager.getCurrentItem() != TAB_1) {  
  139.                     viewPager.setCurrentItem(TAB_1);  
  140.                 }  
  141.                 break;  
  142.             case R.id.tv03:  
  143.                 if (viewPager.getCurrentItem() != TAB_2) {  
  144.                     viewPager.setCurrentItem(TAB_2);  
  145.                 }  
  146.                 break;  
  147.         }  
  148.     }  
  149. }