Android自訂ViewPager指標_Android

來源:互聯網
上載者:User

本文執行個體為大家分享了Android ViewPager指標的製作方法,供大家參考,具體內容如下

1.概述

  ViewPageIndicator這個開源架構大家都接觸過,個人感覺還不錯就是用起來比較麻煩,需要這裡配置那裡配置效果定製起來也不方便。我第一次使用的時候就一直出不來效果,後來找了很久發現是activity的主題沒有配置好。今天我們自己來造個輪子實現一把,其中用到了Adapter模式,如果不清楚這個模式的請看我的Android源碼設計模式分析:http://www.jb51.net/article/96291.htm,下面看一下效果:

  

2.實現 

1).實現基本效果自訂HorizontalScrollView extends HorizontalScrollView,設定ViewPager根據個數不斷遍曆添加子View。

 public class ViewPagerIndicator extends HorizontalScrollView{ public ViewPagerIndicator(Context context) {  this(context, null); } public ViewPagerIndicator(Context context, AttributeSet attrs) {  this(context, attrs, 0); } public ViewPagerIndicator(Context context, AttributeSet attrs,   int defStyleAttr) {  super(context, attrs, defStyleAttr);  this.mContext = context; } @Override public void setViewPager(ViewPager viewPager) {  if (viewPager == null) {   throw new NullPointerException("viewPager is null...");  }  this.mViewPager = viewPager;  int count = mViewPager.getAdapter().getCount();  mContanierGroup.removeAllViews();  // 迴圈添加tabView(TextView)  for (int i = 0; i < count; i++) {   final TextView itemTv = new TextView(mContext);   itemTv.setText(this.mViewPager.getAdapter().getPageTitle(i));   setItemClickEvent(itemTv, i);   mContanierGroup.addTabView(itemTv);   setItemClickEvent(itemTv, i);   mContanierGroup.addTabView(itemTv);  }  setItemParams();  mAdapter.highLightTabView(mContanierGroup.getTabView(mCureentItem));  this.mViewPager.setOnPageChangeListener(this); } private void setItemParams() {  if (mVisibleTabCount != 0) {   final int childCount = mViewPager.getAdapter().getCount();   mRunnable = new Runnable() {    @Override    public void run() {     int tabWidth = getWidth() / mVisibleTabCount;     // 迴圈遍曆設定Tab寬度     for (int index = 0; index < childCount; index++) {      LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mContanierGroup        .getTabView(index).getLayoutParams();      params.width = tabWidth;     }     // 設定寬度,高度,和角標指標     mContanierGroup.setTabWidth(tabWidth);     mContanierGroup.getContainer().getLayoutParams().height = getHeight();     mContanierGroup.setIndicatorView(mAdapter.getIndexView());     mRunnable = null;    }   };   post(mRunnable);  } }}

2).設定ViewPager的滾動監聽,使ViewPager和TabView一起聯動

 @Override public void onPageScrollStateChanged(int position) {  if (position == 0) {   // 設定為不是點擊   mIsClick = false;  }  if (mPageChangeListener != null)   mPageChangeListener.onPageScrollStateChanged(position); } @Override public void onPageScrolled(int position, float offset, int arg2) {  scroll(position, offset);  if (mPageChangeListener != null)   mPageChangeListener.onPageScrolled(position, offset, arg2); } @Override public void onPageSelected(int position) {  mCureentItem = position;  if (mPageChangeListener != null)   mPageChangeListener.onPageSelected(position); } /**  * 指標跟隨手指進行滾動  */ public void scroll(int position, float offset) {  int tabWidth = mContanierGroup.getTabView(0).getWidth();  // 讓選中Tab的一直在最中間  int total = (int) ((position + offset) * tabWidth);  int green = (getWidth() - tabWidth) / 2;  // 滾動的距離  int scroll = total - green;  if (!mIsClick) {   this.scrollTo(scroll, 0);   mContanierGroup.scrollIndicator(position, offset);  } }

3).最後我們採用適配器Adapter模式,完成高亮和下標指標。

public abstract class IndicatorAdapter<T extends View> { /**  * 擷取Tab View  */ public abstract T getTabView(int position); /**  * 擷取角標View  */ public View getIndexView() {  return null; } /**  * 高亮當前Tab  */ public void highLightTabView(T tabView) { } /**  * 恢複當前Tab  */ public void restoreTabView(T tabView) { }}

4).最後我們來看在activity中怎麼使用,在IndicatorAdapter有四個方法,我們只需要實現一個方法,其餘三個方法如果不使用可以不複寫。以Adapter的形式暴露出來,那麼使用者可以自己去實現而不必受局限。

 mIndicator.setAdapter(mViewpager, new IndicatorAdapter<TextView>() {   @Override   public TextView getTabView(int position) {    TextView tabView = new TextView(getBaseContext());    tabView.setTextColor(Color.WHITE);    tabView.setText(mTitles.get(position));    tabView.setPadding(20, 20, 20, 20);    tabView.setGravity(Gravity.CENTER);    return tabView;   }   @Override   public View getIndexView() {    ImageView view = new ImageView(getBaseContext());    view.setImageResource(R.drawable.corners_login_nomral);    view.setPadding(25, 0, 25, 0);    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(      LayoutParams.WRAP_CONTENT, 6);    view.setLayoutParams(params);    return view;   }   @Override   public void highLightTabView(TextView tabView) {    final TextView itemView = (TextView) tabView;    itemView.setTextColor(Color.RED);   }   @Override   public void restoreTabView(TextView tabView) {    final TextView itemView = (TextView) tabView;    itemView.setTextColor(Color.WHITE);   }  });

不需配置的ViewPagerIndicator 的源碼下載:http://xiazai.jb51.net/201611/yuanma/AndroidViewPager(jb51.net).rar

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.