PagerSlidingTabStrip加ViewPager的使用,PagerSlidingTabStrip增加单条目的点击事件

来源:互联网 发布:汇编中结构数组的定义 编辑:程序博客网 时间:2024/05/22 06:24

使用PagerSlidingTabStrip和viewPager实现了联动,但是PagerSlidingTabStrip并没有给出设置字体大小,颜色,以及滑动条长度的方法,自己加以处理了一下。

需求还需要设置点击事件。如图




整片代码:

import java.util.Locale;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Typeface;import android.os.Build;import android.os.Parcel;import android.os.Parcelable;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.TypedValue;import android.view.Gravity;import android.view.View;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.widget.HorizontalScrollView;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.TextView;import com.yizooo.yizooo.R;import com.yizooo.yizooo.ui.*;import com.yizooo.yizooo.ui.LogUtils;/** * 滑动指示器pstsindicatorcolor颜色 * 在视图的底部的全宽度的线pstsunderlinecolor颜色 * 选项卡之间的分隔pstsdividercolor颜色 * 滑动指示器pstsindicatorheightheight * 在视图的底部的全宽度的线pstsunderlineheight高度 * pstsdividerpadding顶部和底部填充的分频器 * pststabpaddingleftright左、右填充每个选项卡 * pstsscrolloffset卷轴被选择的标签的偏移 * pststabbackground背景绘制的每个标签,应该是一个statelistdrawable * pstsshouldexpand如果设置为TRUE,每个标签都给予同样的重量,默认为false * pststextallcaps如果为真,所有选项卡标题都是大写,默认为true * 扩展4个属性 , 分别是 默认的字体大小 和颜色 ,和选中后的 字体大小和颜色 */public class PagerSlidingTabStrip extends HorizontalScrollView {   private int indicatorwidth = 100;   public String confirmSort = "desc";   public interface IconTabProvider {      public int getPageIconResId(int position);   }   // @formatter:off   private static final int[] ATTRS = new int[] {         android.R.attr.textSize,         android.R.attr.textColor   };   // @formatter:on   private LinearLayout.LayoutParams defaultTabLayoutParams;   private LinearLayout.LayoutParams expandedTabLayoutParams;   private final PageListener pageListener = new PageListener();   public OnPageChangeListener delegatePageListener;   private LinearLayout tabsContainer;   private ViewPager pager;   private int tabCount;   private int currentPosition = 0;   private int selectedPosition = 0;   private float currentPositionOffset = 0f;   private Paint rectPaint;   private Paint dividerPaint;   private int indicatorColor = 0xFF666666;   private int underlineColor = 0x1A000000;   private int dividerColor = 0x1A000000;   private boolean shouldExpand = false;   private boolean textAllCaps = true;   private int scrollOffset = 52;   private int indicatorHeight = 8;   private int underlineHeight = 2;   private int dividerPadding = 12;   private int tabPadding = 24;   private int dividerWidth = 1;   private int tabTextSize = 12;   private int tabTextColor = 0xFF666666;   private int selectedTabTextSize=20;   private int selectedTabTextColor = 0xFF666666;   private Typeface tabTypeface = null;   private int tabTypefaceStyle = Typeface.NORMAL;   private int lastScrollX = 0;   private int tabBackgroundResId = R.drawable.background_tab;   private Locale locale;   public PagerSlidingTabStrip(Context context) {      this(context, null);   }   public PagerSlidingTabStrip(Context context, AttributeSet attrs) {      this(context, attrs, 0);   }   public PagerSlidingTabStrip(Context context, AttributeSet attrs, int defStyle) {      super(context, attrs, defStyle);      setFillViewport(true);      setWillNotDraw(false);      tabsContainer = new LinearLayout(context);      tabsContainer.setOrientation(LinearLayout.HORIZONTAL);      tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));      addView(tabsContainer);      DisplayMetrics dm = getResources().getDisplayMetrics();      scrollOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, scrollOffset, dm);      indicatorHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, indicatorHeight, dm);      underlineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, underlineHeight, dm);      dividerPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerPadding, dm);      tabPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tabPadding, dm);      dividerWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerWidth, dm);      tabTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, tabTextSize, dm);      // get system attrs (android:textSize and android:textColor)      TypedArray a = context.obtainStyledAttributes(attrs, ATTRS);      // tabTextSize = a.getDimensionPixelSize(0, tabTextSize);      //tabTextColor = a.getColor(1, tabTextColor);      a.recycle();      // get custom attrs      a = context.obtainStyledAttributes(attrs, R.styleable.PagerSlidingTabStrip);      indicatorColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsIndicatorColor, indicatorColor);
增加字体颜色大小的方法
      //下面4个扩展的属性      tabTextSize=a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_zmsTabTextSize, tabTextSize);      tabTextColor=a.getColor(R.styleable.PagerSlidingTabStrip_zmsTabTextColor, tabTextColor);      selectedTabTextSize=a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_zmsSelectedTabTextSize, selectedTabTextSize);      selectedTabTextColor=a.getColor(R.styleable.PagerSlidingTabStrip_zmsSelectedTabTextColor, indicatorColor);      underlineColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsUnderlineColor, underlineColor);      dividerColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsDividerColor, dividerColor);      indicatorHeight = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsIndicatorHeight, indicatorHeight);      underlineHeight = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsUnderlineHeight, underlineHeight);      dividerPadding = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsDividerPadding, dividerPadding);      tabPadding = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsTabPaddingLeftRight, tabPadding);      tabBackgroundResId = a.getResourceId(R.styleable.PagerSlidingTabStrip_pstsTabBackground, tabBackgroundResId);      shouldExpand = a.getBoolean(R.styleable.PagerSlidingTabStrip_pstsShouldExpand, shouldExpand);      scrollOffset = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsScrollOffset, scrollOffset);      textAllCaps = a.getBoolean(R.styleable.PagerSlidingTabStrip_pstsTextAllCaps, textAllCaps);      a.recycle();      rectPaint = new Paint();      rectPaint.setAntiAlias(true);      rectPaint.setStyle(Style.FILL);      dividerPaint = new Paint();      dividerPaint.setAntiAlias(true);      dividerPaint.setStrokeWidth(dividerWidth);      defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);      expandedTabLayoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f);      if (locale == null) {         locale = getResources().getConfiguration().locale;      }   }   public void setViewPager(ViewPager pager) {      this.pager = pager;      if (pager.getAdapter() == null) {         throw new IllegalStateException("ViewPager does not have adapter instance.");      }      pager.setOnPageChangeListener(pageListener);      notifyDataSetChanged();   }   public void setOnPageChangeListener(OnPageChangeListener listener) {      this.delegatePageListener = listener;   }   public void notifyDataSetChanged() {      LogUtils.i("notifyDataSetChanged");      tabsContainer.removeAllViews();      tabCount = pager.getAdapter().getCount();      for (int i = 0; i < tabCount; i++) {         if (pager.getAdapter() instanceof IconTabProvider) {            addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i));         } else {            addTextTab(i, pager.getAdapter().getPageTitle(i).toString());         }      }      updateTabStyles();      getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {         @Override         public void onGlobalLayout() {            getViewTreeObserver().removeGlobalOnLayoutListener(this);            currentPosition = pager.getCurrentItem();            scrollToChild(currentPosition, 0);         }      });   }   private void addTextTab(final int position, String title) {      TextView tab = new TextView(getContext());      tab.setText(title);      tab.setGravity(Gravity.CENTER);      tab.setSingleLine();      addTab(position, tab);   }   private void addIconTab(final int position, int resId) {      ImageButton tab = new ImageButton(getContext());      tab.setImageResource(resId);      addTab(position, tab);   }
/**
*通过广播处理了点击事件。切换排序
*/
   private void addTab(final int position, View tab) {      tab.setFocusable(true);      tab.setOnClickListener(new OnClickListener() {         @Override         public void onClick(View v) {            pager.setCurrentItem(position);            LogUtils.i("pager");            if (currentPosition == selectedPosition && selectedPosition == 2) {               LogUtils.i("pager两次");               if (confirmSort == "asc"){                  confirmSort = "desc";               }else {                  confirmSort = "asc";               }               setViewPager(pager);               Intent mIntent = new Intent("REFRESH");               mIntent.putExtra("confirmSort", confirmSort);               mIntent.putExtra("name",pager.getAdapter().getPageTitle(2).toString());               //发送广播               UIUtils.getContext().sendBroadcast(mIntent);            }         }      });      tab.setPadding(tabPadding, 0, tabPadding, 0);      tabsContainer.addView(tab, position, shouldExpand ? expandedTabLayoutParams : defaultTabLayoutParams);   }   private void updateTabStyles() {      for (int i = 0; i < tabCount; i++) {         View v = tabsContainer.getChildAt(i);         v.setBackgroundResource(tabBackgroundResId);         if (v instanceof TextView) {            TextView tab = (TextView) v;            tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabTextSize);            tab.setTypeface(tabTypeface, tabTypefaceStyle);            tab.setTextColor(tabTextColor);            // setAllCaps() is only available from API 14, so the upper case is made manually if we are on a            // pre-ICS-build            if (textAllCaps) {               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {                  tab.setAllCaps(true);               } else {                  tab.setText(tab.getText().toString().toUpperCase(locale));               }            }            if (i == selectedPosition) {               tab.setTextColor(selectedTabTextColor);               tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, selectedTabTextSize);            }         }      }   }   private void scrollToChild(int position, int offset) {      if (tabCount == 0) {         return;      }      int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset;      if (position > 0 || offset > 0) {         newScrollX -= scrollOffset;      }      if (newScrollX != lastScrollX) {         lastScrollX = newScrollX;         scrollTo(newScrollX, 0);      }   }
/**
*处理滑动条宽度的代码,
*/
   /**    * 设置滑动条的宽度(必须设置,全宽也需要设置,也可以删掉此方法,和变量indicatorwidth)    * @param width    */   public void setIndicatorWidth(int width){      this.indicatorwidth = width;   }   @Override   protected void onDraw(Canvas canvas) {      super.onDraw(canvas);      if (isInEditMode() || tabCount == 0) {         return;      }      final int height = getHeight();      // draw underline      rectPaint.setColor(underlineColor);      canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint);      // draw indicator line      rectPaint.setColor(indicatorColor);      // default: line below current tab      View currentTab = tabsContainer.getChildAt(currentPosition);      int tabPadding=(currentTab.getWidth()-indicatorwidth)/2;      float lineLeft = currentTab.getLeft()+tabPadding;      float lineRight = currentTab.getRight()-tabPadding;      // if there is an offset, start interpolating left and right coordinates between current and next tab      if (currentPositionOffset > 0f && currentPosition < tabCount - 1) {         View nextTab = tabsContainer.getChildAt(currentPosition + 1);         final float nextTabLeft = nextTab.getLeft()+tabPadding;         final float nextTabRight = nextTab.getRight()-tabPadding;         lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft);         lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight);      }      canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint);      // draw divider      dividerPaint.setColor(dividerColor);      for (int i = 0; i < tabCount - 1; i++) {         View tab = tabsContainer.getChildAt(i);         canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint);      }   }   private class PageListener implements OnPageChangeListener {      @Override      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {         currentPosition = position;         currentPositionOffset = positionOffset;         scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth()));         invalidate();         if (delegatePageListener != null) {            delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels);         }      }      @Override      public void onPageScrollStateChanged(int state) {         if (state == ViewPager.SCROLL_STATE_IDLE) {            scrollToChild(pager.getCurrentItem(), 0);         }         if (delegatePageListener != null) {            delegatePageListener.onPageScrollStateChanged(state);         }      }      @Override      public void onPageSelected(int position) {         selectedPosition = position;         updateTabStyles();         if (delegatePageListener != null) {            delegatePageListener.onPageSelected(position);         }      }   }   public void setIndicatorColor(int indicatorColor) {      this.indicatorColor = indicatorColor;      invalidate();   }   public void setIndicatorColorResource(int resId) {      this.indicatorColor = getResources().getColor(resId);      invalidate();   }   public int getIndicatorColor() {      return this.indicatorColor;   }   public void setIndicatorHeight(int indicatorLineHeightPx) {      this.indicatorHeight = indicatorLineHeightPx;      invalidate();   }   public int getIndicatorHeight() {      return indicatorHeight;   }   public void setUnderlineColor(int underlineColor) {      this.underlineColor = underlineColor;      invalidate();   }   public void setUnderlineColorResource(int resId) {      this.underlineColor = getResources().getColor(resId);      invalidate();   }   public int getUnderlineColor() {      return underlineColor;   }   public void setDividerColor(int dividerColor) {      this.dividerColor = dividerColor;      invalidate();   }   public void setDividerColorResource(int resId) {      this.dividerColor = getResources().getColor(resId);      invalidate();   }   public int getDividerColor() {      return dividerColor;   }   public void setUnderlineHeight(int underlineHeightPx) {      this.underlineHeight = underlineHeightPx;      invalidate();   }   public int getUnderlineHeight() {      return underlineHeight;   }   public void setDividerPadding(int dividerPaddingPx) {      this.dividerPadding = dividerPaddingPx;      invalidate();   }   public int getDividerPadding() {      return dividerPadding;   }   public void setScrollOffset(int scrollOffsetPx) {      this.scrollOffset = scrollOffsetPx;      invalidate();   }   public int getScrollOffset() {      return scrollOffset;   }   public void setShouldExpand(boolean shouldExpand) {      this.shouldExpand = shouldExpand;      notifyDataSetChanged();   }   public boolean getShouldExpand() {      return shouldExpand;   }   public boolean isTextAllCaps() {      return textAllCaps;   }   public void setAllCaps(boolean textAllCaps) {      this.textAllCaps = textAllCaps;   }   public void setTextSize(int textSizePx) {      this.tabTextSize = textSizePx;      updateTabStyles();   }   public void setSelectedTextSize(int setSelectedTextSize) {      this.selectedTabTextSize = setSelectedTextSize;      updateTabStyles();   }   public int getTextSize() {      return tabTextSize;   }   public void setTextColor(int textColor) {      this.tabTextColor = textColor;      updateTabStyles();   }   public void setTextColorResource(int resId) {      this.tabTextColor = getResources().getColor(resId);      updateTabStyles();   }   public int getTextColor() {      return tabTextColor;   }   public void setSelectedTextColor(int textColor) {      this.selectedTabTextColor = textColor;      updateTabStyles();   }   public void setSelectedTextColorResource(int resId) {      this.selectedTabTextColor = getResources().getColor(resId);      updateTabStyles();   }   public int getSelectedTextColor() {      return selectedTabTextColor;   }   public void setTypeface(Typeface typeface, int style) {      this.tabTypeface = typeface;      this.tabTypefaceStyle = style;      updateTabStyles();   }   public void setTabBackground(int resId) {      this.tabBackgroundResId = resId;      updateTabStyles();   }   public int getTabBackground() {      return tabBackgroundResId;   }   public void setTabPaddingLeftRight(int paddingPx) {      this.tabPadding = paddingPx;      updateTabStyles();   }   public int getTabPaddingLeftRight() {      return tabPadding;   }   @Override   public void onRestoreInstanceState(Parcelable state) {      SavedState savedState = (SavedState) state;      super.onRestoreInstanceState(savedState.getSuperState());      currentPosition = savedState.currentPosition;      requestLayout();   }   @Override   public Parcelable onSaveInstanceState() {      Parcelable superState = super.onSaveInstanceState();      SavedState savedState = new SavedState(superState);      savedState.currentPosition = currentPosition;      return savedState;   }   static class SavedState extends BaseSavedState {      int currentPosition;      public SavedState(Parcelable superState) {         super(superState);      }      private SavedState(Parcel in) {         super(in);         currentPosition = in.readInt();      }      @Override      public void writeToParcel(Parcel dest, int flags) {         super.writeToParcel(dest, flags);         dest.writeInt(currentPosition);      }      public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {         @Override         public SavedState createFromParcel(Parcel in) {            return new SavedState(in);         }         @Override         public SavedState[] newArray(int size) {            return new SavedState[size];         }      };   }}


1 0