Java tutorial
/* * The MIT License (MIT) * * Copyright (c) 2015 H07000223 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ package com.youqu.piclbs.util; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; import com.youqu.piclbs.R; /** * TabLayout,ViewPager? */ public class SlidingTabLayout extends HorizontalScrollView implements ViewPager.OnPageChangeListener { private Context mContext; private ViewPager mViewPager; private String[] mTitles; private LinearLayout mTabsContainer; private int mCurrentTab; private float mCurrentPositionOffset; private int mTabCount; /** * */ private Rect mIndicatorRect = new Rect(); /** * */ private Rect mTabRect = new Rect(); private GradientDrawable mIndicatorDrawable = new GradientDrawable(); private Paint mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint mDividerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint mTrianglePaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Path mTrianglePath = new Path(); private static final int STYLE_NORMAL = 0; private static final int STYLE_TRIANGLE = 1; private static final int STYLE_BLOCK = 2; private int mIndicatorStyle = STYLE_NORMAL; private float mTabPadding; private boolean mTabSpaceEqual; private float mTabWidth; /** * indicator */ private int mIndicatorColor; private float mIndicatorHeight; private float mIndicatorWidth; private float mIndicatorCornerRadius; private float mIndicatorMarginLeft; private float mIndicatorMarginTop; private float mIndicatorMarginRight; private float mIndicatorMarginBottom; private int mIndicatorGravity; private boolean mIndicatorWidthEqualTitle; /** * underline */ private int mUnderlineColor; private float mUnderlineHeight; private int mUnderlineGravity; /** * divider */ private int mDividerColor; private float mDividerWidth; private float mDividerPadding; /** * title */ private float mTextSize; private int mTextSelectColor; private int mTextUnselectColor; private boolean mTextBold; private boolean mTextAllCaps; private int mLastScrollX; private int mHeight; public SlidingTabLayout(Context context) { this(context, null, 0); } public SlidingTabLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SlidingTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setFillViewport(true);//??? setWillNotDraw(false);//?onDraw,??flag setClipChildren(false); setClipToPadding(false); this.mContext = context; mTabsContainer = new LinearLayout(context); addView(mTabsContainer); obtainAttributes(context, attrs); //get layout_height String height = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_height"); if (height.equals(ViewGroup.LayoutParams.MATCH_PARENT + "")) { } else if (height.equals(ViewGroup.LayoutParams.WRAP_CONTENT + "")) { } else { int[] systemAttrs = { android.R.attr.layout_height }; TypedArray a = context.obtainStyledAttributes(attrs, systemAttrs); mHeight = a.getDimensionPixelSize(0, ViewGroup.LayoutParams.WRAP_CONTENT); a.recycle(); } } private void obtainAttributes(Context context, AttributeSet attrs) { TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SlidingTabLayout); mIndicatorStyle = ta.getInt(R.styleable.SlidingTabLayout_tl_indicator_style, STYLE_NORMAL); mIndicatorColor = ta.getColor(R.styleable.SlidingTabLayout_tl_indicator_color, Color.parseColor(mIndicatorStyle == STYLE_BLOCK ? "#4B6A87" : "#ffffff")); mIndicatorHeight = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_height, dp2px(mIndicatorStyle == STYLE_TRIANGLE ? 4 : (mIndicatorStyle == STYLE_BLOCK ? -1 : 2))); mIndicatorWidth = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_width, dp2px(mIndicatorStyle == STYLE_TRIANGLE ? 10 : -1)); mIndicatorCornerRadius = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_corner_radius, dp2px(mIndicatorStyle == STYLE_BLOCK ? -1 : 0)); mIndicatorMarginLeft = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_margin_left, dp2px(0)); mIndicatorMarginTop = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_margin_top, dp2px(mIndicatorStyle == STYLE_BLOCK ? 7 : 0)); mIndicatorMarginRight = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_margin_right, dp2px(0)); mIndicatorMarginBottom = ta.getDimension(R.styleable.SlidingTabLayout_tl_indicator_margin_bottom, dp2px(mIndicatorStyle == STYLE_BLOCK ? 7 : 0)); mIndicatorGravity = ta.getInt(R.styleable.SlidingTabLayout_tl_indicator_gravity, Gravity.BOTTOM); mIndicatorWidthEqualTitle = ta.getBoolean(R.styleable.SlidingTabLayout_tl_indicator_width_equal_title, false); mUnderlineColor = ta.getColor(R.styleable.SlidingTabLayout_tl_underline_color, Color.parseColor("#ffffff")); mUnderlineHeight = ta.getDimension(R.styleable.SlidingTabLayout_tl_underline_height, dp2px(0)); mUnderlineGravity = ta.getInt(R.styleable.SlidingTabLayout_tl_underline_gravity, Gravity.BOTTOM); mDividerColor = ta.getColor(R.styleable.SlidingTabLayout_tl_divider_color, Color.parseColor("#ffffff")); mDividerWidth = ta.getDimension(R.styleable.SlidingTabLayout_tl_divider_width, dp2px(0)); mDividerPadding = ta.getDimension(R.styleable.SlidingTabLayout_tl_divider_padding, dp2px(12)); mTextSize = ta.getDimension(R.styleable.SlidingTabLayout_tl_textsize, sp2px(14)); mTextSelectColor = ta.getColor(R.styleable.SlidingTabLayout_tl_textSelectColor, Color.parseColor("#ffffff")); mTextUnselectColor = ta.getColor(R.styleable.SlidingTabLayout_tl_textUnselectColor, Color.parseColor("#AAffffff")); mTextBold = ta.getBoolean(R.styleable.SlidingTabLayout_tl_textBold, false); mTextAllCaps = ta.getBoolean(R.styleable.SlidingTabLayout_tl_textAllCaps, false); mTabSpaceEqual = ta.getBoolean(R.styleable.SlidingTabLayout_tl_tab_space_equal, false); mTabWidth = ta.getDimension(R.styleable.SlidingTabLayout_tl_tab_width, dp2px(-1)); mTabPadding = ta.getDimension(R.styleable.SlidingTabLayout_tl_tab_padding, mTabSpaceEqual || mTabWidth > 0 ? dp2px(0) : dp2px(20)); ta.recycle(); } /** * ?ViewPager */ public void setViewPager(ViewPager vp) { if (vp == null || vp.getAdapter() == null) { throw new IllegalStateException("ViewPager or ViewPager adapter can not be NULL !"); } this.mViewPager = vp; this.mViewPager.removeOnPageChangeListener(this); this.mViewPager.addOnPageChangeListener(this); notifyDataSetChanged(); } /** * ?ViewPager,?ViewPager?titles? */ public void setViewPager(ViewPager vp, String[] titles) { if (vp == null || vp.getAdapter() == null) { throw new IllegalStateException("ViewPager or ViewPager adapter can not be NULL !"); } if (titles == null || titles.length == 0) { throw new IllegalStateException("Titles can not be EMPTY !"); } if (titles.length != vp.getAdapter().getCount()) { throw new IllegalStateException("Titles length must be the same as the page count !"); } this.mViewPager = vp; this.mTitles = titles; this.mViewPager.removeOnPageChangeListener(this); this.mViewPager.addOnPageChangeListener(this); notifyDataSetChanged(); } /** * ? */ public void notifyDataSetChanged() { mTabsContainer.removeAllViews(); this.mTabCount = mTitles == null ? mViewPager.getAdapter().getCount() : mTitles.length; View tabView; for (int i = 0; i < mTabCount; i++) { if (mViewPager.getAdapter() instanceof CustomTabProvider) { tabView = ((CustomTabProvider) mViewPager.getAdapter()).getCustomTabView(this, i); } else { tabView = View.inflate(mContext, R.layout.layout_sliding_tab, null); } CharSequence pageTitle = mTitles == null ? mViewPager.getAdapter().getPageTitle(i) : mTitles[i]; addTab(i, pageTitle.toString(), tabView); } updateTabStyles(); } /** * tab */ private void addTab(final int position, String title, View tabView) { TextView tv_tab_title = (TextView) tabView.findViewById(R.id.tv_tab_title); if (tv_tab_title != null) { if (title != null) tv_tab_title.setText(title); } tabView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mViewPager.getCurrentItem() != position) { mViewPager.setCurrentItem(position); if (mListener != null) { mListener.onTabSelect(position); } } else { if (mListener != null) { mListener.onTabReselect(position); } } } }); /** ?Tab? */ LinearLayout.LayoutParams lp_tab = mTabSpaceEqual ? new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f) : new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); if (mTabWidth > 0) { lp_tab = new LinearLayout.LayoutParams((int) mTabWidth, LayoutParams.MATCH_PARENT); } mTabsContainer.addView(tabView, position, lp_tab); } private void updateTabStyles() { for (int i = 0; i < mTabCount; i++) { View v = mTabsContainer.getChildAt(i); // v.setPadding((int) mTabPadding, v.getPaddingTop(), (int) mTabPadding, v.getPaddingBottom()); TextView tv_tab_title = (TextView) v.findViewById(R.id.tv_tab_title); if (tv_tab_title != null) { tv_tab_title.setTextColor(i == mCurrentTab ? mTextSelectColor : mTextUnselectColor); tv_tab_title.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize); tv_tab_title.setPadding((int) mTabPadding, 0, (int) mTabPadding, 0); if (mTextAllCaps) { tv_tab_title.setText(tv_tab_title.getText().toString().toUpperCase()); } if (mTextBold) { tv_tab_title.getPaint().setFakeBoldText(mTextBold); } } } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { /** * position:?View? * mCurrentPositionOffset:?View???.[0,1) */ this.mCurrentTab = position; this.mCurrentPositionOffset = positionOffset; scrollToCurrentTab(); invalidate(); } @Override public void onPageSelected(int position) { updateTabSelection(position); } @Override public void onPageScrollStateChanged(int state) { } /** * HorizontalScrollView?tab, */ private void scrollToCurrentTab() { if (mTabCount <= 0) { return; } int offset = (int) (mCurrentPositionOffset * mTabsContainer.getChildAt(mCurrentTab).getWidth()); /**?Tableft+?TabWidthpositionOffset*/ int newScrollX = mTabsContainer.getChildAt(mCurrentTab).getLeft() + offset; if (mCurrentTab > 0 || offset > 0) { /**HorizontalScrollView?tab,*/ newScrollX -= getWidth() / 2 - getPaddingLeft(); calcIndicatorRect(); newScrollX += ((mTabRect.right - mTabRect.left) / 2); } if (newScrollX != mLastScrollX) { mLastScrollX = newScrollX; /** scrollToint x,int y:x,y???,??? * x:?x???? * y:?y???? */ scrollTo(newScrollX, 0); } } private void updateTabSelection(int position) { for (int i = 0; i < mTabCount; ++i) { View tabView = mTabsContainer.getChildAt(i); final boolean isSelect = i == position; TextView tab_title = (TextView) tabView.findViewById(R.id.tv_tab_title); if (tab_title != null) { tab_title.setTextColor(isSelect ? mTextSelectColor : mTextUnselectColor); } if (mViewPager.getAdapter() instanceof CustomTabProvider) { if (isSelect) { ((CustomTabProvider) mViewPager.getAdapter()).tabSelect(tabView); } else { ((CustomTabProvider) mViewPager.getAdapter()).tabUnselect(tabView); } } } } private float margin; private void calcIndicatorRect() { View currentTabView = mTabsContainer.getChildAt(this.mCurrentTab); float left = currentTabView.getLeft(); float right = currentTabView.getRight(); //for mIndicatorWidthEqualTitle if (mIndicatorStyle == STYLE_NORMAL && mIndicatorWidthEqualTitle) { TextView tab_title = (TextView) currentTabView.findViewById(R.id.tv_tab_title); mTextPaint.setTextSize(mTextSize); float textWidth = mTextPaint.measureText(tab_title.getText().toString()); margin = (right - left - textWidth) / 2; } if (this.mCurrentTab < mTabCount - 1) { View nextTabView = mTabsContainer.getChildAt(this.mCurrentTab + 1); float nextTabLeft = nextTabView.getLeft(); float nextTabRight = nextTabView.getRight(); left = left + mCurrentPositionOffset * (nextTabLeft - left); right = right + mCurrentPositionOffset * (nextTabRight - right); //for mIndicatorWidthEqualTitle if (mIndicatorStyle == STYLE_NORMAL && mIndicatorWidthEqualTitle) { TextView next_tab_title = (TextView) nextTabView.findViewById(R.id.tv_tab_title); mTextPaint.setTextSize(mTextSize); float nextTextWidth = mTextPaint.measureText(next_tab_title.getText().toString()); float nextMargin = (nextTabRight - nextTabLeft - nextTextWidth) / 2; margin = margin + mCurrentPositionOffset * (nextMargin - margin); } } mIndicatorRect.left = (int) left; mIndicatorRect.right = (int) right; //for mIndicatorWidthEqualTitle if (mIndicatorStyle == STYLE_NORMAL && mIndicatorWidthEqualTitle) { mIndicatorRect.left = (int) (left + margin - 1); mIndicatorRect.right = (int) (right - margin - 1); } mTabRect.left = (int) left; mTabRect.right = (int) right; if (mIndicatorWidth < 0) { //indicatorWidth?0,jpardogo's PagerSlidingTabStrip } else {//indicatorWidth0,? float indicatorLeft = currentTabView.getLeft() + (currentTabView.getWidth() - mIndicatorWidth) / 2; if (this.mCurrentTab < mTabCount - 1) { View nextTab = mTabsContainer.getChildAt(this.mCurrentTab + 1); indicatorLeft = indicatorLeft + mCurrentPositionOffset * (currentTabView.getWidth() / 2 + nextTab.getWidth() / 2); } mIndicatorRect.left = (int) indicatorLeft; mIndicatorRect.right = (int) (mIndicatorRect.left + mIndicatorWidth); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (isInEditMode() || mTabCount <= 0) { return; } int height = getHeight(); int paddingLeft = getPaddingLeft(); // draw divider if (mDividerWidth > 0) { mDividerPaint.setStrokeWidth(mDividerWidth); mDividerPaint.setColor(mDividerColor); for (int i = 0; i < mTabCount - 1; i++) { View tab = mTabsContainer.getChildAt(i); canvas.drawLine(paddingLeft + tab.getRight(), mDividerPadding, paddingLeft + tab.getRight(), height - mDividerPadding, mDividerPaint); } } // draw underline if (mUnderlineHeight > 0) { mRectPaint.setColor(mUnderlineColor); if (mUnderlineGravity == Gravity.BOTTOM) { canvas.drawRect(paddingLeft, height - mUnderlineHeight, mTabsContainer.getWidth() + paddingLeft, height, mRectPaint); } else { canvas.drawRect(paddingLeft, 0, mTabsContainer.getWidth() + paddingLeft, mUnderlineHeight, mRectPaint); } } //draw indicator line calcIndicatorRect(); if (mIndicatorStyle == STYLE_TRIANGLE) { if (mIndicatorHeight > 0) { mTrianglePaint.setColor(mIndicatorColor); mTrianglePath.reset(); mTrianglePath.moveTo(paddingLeft + mIndicatorRect.left, height); mTrianglePath.lineTo(paddingLeft + mIndicatorRect.left / 2 + mIndicatorRect.right / 2, height - mIndicatorHeight); mTrianglePath.lineTo(paddingLeft + mIndicatorRect.right, height); mTrianglePath.close(); canvas.drawPath(mTrianglePath, mTrianglePaint); } } else if (mIndicatorStyle == STYLE_BLOCK) { if (mIndicatorHeight < 0) { mIndicatorHeight = height - mIndicatorMarginTop - mIndicatorMarginBottom; } else { } if (mIndicatorHeight > 0) { if (mIndicatorCornerRadius < 0 || mIndicatorCornerRadius > mIndicatorHeight / 2) { mIndicatorCornerRadius = mIndicatorHeight / 2; } mIndicatorDrawable.setColor(mIndicatorColor); mIndicatorDrawable.setBounds(paddingLeft + (int) mIndicatorMarginLeft + mIndicatorRect.left, (int) mIndicatorMarginTop, (int) (paddingLeft + mIndicatorRect.right - mIndicatorMarginRight), (int) (mIndicatorMarginTop + mIndicatorHeight)); mIndicatorDrawable.setCornerRadius(mIndicatorCornerRadius); mIndicatorDrawable.draw(canvas); } } else { /* mRectPaint.setColor(mIndicatorColor); calcIndicatorRect(); canvas.drawRect(getPaddingLeft() + mIndicatorRect.left, getHeight() - mIndicatorHeight, mIndicatorRect.right + getPaddingLeft(), getHeight(), mRectPaint);*/ if (mIndicatorHeight > 0) { mIndicatorDrawable.setColor(mIndicatorColor); if (mIndicatorGravity == Gravity.BOTTOM) { mIndicatorDrawable.setBounds(paddingLeft + (int) mIndicatorMarginLeft + mIndicatorRect.left, height - (int) mIndicatorHeight - (int) mIndicatorMarginBottom, paddingLeft + mIndicatorRect.right - (int) mIndicatorMarginRight, height - (int) mIndicatorMarginBottom); } else { mIndicatorDrawable.setBounds(paddingLeft + (int) mIndicatorMarginLeft + mIndicatorRect.left, (int) mIndicatorMarginTop, paddingLeft + mIndicatorRect.right - (int) mIndicatorMarginRight, (int) mIndicatorHeight + (int) mIndicatorMarginTop); } mIndicatorDrawable.setCornerRadius(mIndicatorCornerRadius); mIndicatorDrawable.draw(canvas); } } } //setter and getter public void setCurrentTab(int currentTab) { this.mCurrentTab = currentTab; mViewPager.setCurrentItem(currentTab); } public void setIndicatorStyle(int indicatorStyle) { this.mIndicatorStyle = indicatorStyle; invalidate(); } public void setTabPadding(float tabPadding) { this.mTabPadding = dp2px(tabPadding); updateTabStyles(); } public void setTabSpaceEqual(boolean tabSpaceEqual) { this.mTabSpaceEqual = tabSpaceEqual; updateTabStyles(); } public void setTabWidth(float tabWidth) { this.mTabWidth = dp2px(tabWidth); updateTabStyles(); } public void setIndicatorColor(int indicatorColor) { this.mIndicatorColor = indicatorColor; invalidate(); } public void setIndicatorHeight(float indicatorHeight) { this.mIndicatorHeight = dp2px(indicatorHeight); invalidate(); } public void setIndicatorWidth(float indicatorWidth) { this.mIndicatorWidth = dp2px(indicatorWidth); invalidate(); } public void setIndicatorCornerRadius(float indicatorCornerRadius) { this.mIndicatorCornerRadius = dp2px(indicatorCornerRadius); invalidate(); } public void setIndicatorGravity(int indicatorGravity) { this.mIndicatorGravity = indicatorGravity; invalidate(); } public void setIndicatorMargin(float indicatorMarginLeft, float indicatorMarginTop, float indicatorMarginRight, float indicatorMarginBottom) { this.mIndicatorMarginLeft = dp2px(indicatorMarginLeft); this.mIndicatorMarginTop = dp2px(indicatorMarginTop); this.mIndicatorMarginRight = dp2px(indicatorMarginRight); this.mIndicatorMarginBottom = dp2px(indicatorMarginBottom); invalidate(); } public void setIndicatorWidthEqualTitle(boolean indicatorWidthEqualTitle) { this.mIndicatorWidthEqualTitle = indicatorWidthEqualTitle; invalidate(); } public void setUnderlineColor(int underlineColor) { this.mUnderlineColor = underlineColor; invalidate(); } public void setUnderlineHeight(float underlineHeight) { this.mUnderlineHeight = dp2px(underlineHeight); invalidate(); } public void setUnderlineGravity(int underlineGravity) { this.mUnderlineGravity = underlineGravity; invalidate(); } public void setDividerColor(int dividerColor) { this.mDividerColor = dividerColor; invalidate(); } public void setDividerWidth(float dividerWidth) { this.mDividerWidth = dp2px(dividerWidth); invalidate(); } public void setDividerPadding(float dividerPadding) { this.mDividerPadding = dp2px(dividerPadding); invalidate(); } public void setTextsize(float textsize) { this.mTextSize = sp2px(textsize); updateTabStyles(); } public void setTextSelectColor(int textSelectColor) { this.mTextSelectColor = textSelectColor; updateTabStyles(); } public void setTextUnselectColor(int textUnselectColor) { this.mTextUnselectColor = textUnselectColor; updateTabStyles(); } public void setTextBold(boolean textBold) { this.mTextBold = textBold; updateTabStyles(); } public void setTextAllCaps(boolean textAllCaps) { this.mTextAllCaps = textAllCaps; updateTabStyles(); } public int getTabCount() { return mTabCount; } public int getCurrentTab() { return mCurrentTab; } public int getIndicatorStyle() { return mIndicatorStyle; } public float getTabPadding() { return mTabPadding; } public boolean isTabSpaceEqual() { return mTabSpaceEqual; } public float getTabWidth() { return mTabWidth; } public int getIndicatorColor() { return mIndicatorColor; } public float getIndicatorHeight() { return mIndicatorHeight; } public float getIndicatorWidth() { return mIndicatorWidth; } public float getIndicatorCornerRadius() { return mIndicatorCornerRadius; } public float getIndicatorMarginLeft() { return mIndicatorMarginLeft; } public float getIndicatorMarginTop() { return mIndicatorMarginTop; } public float getIndicatorMarginRight() { return mIndicatorMarginRight; } public float getIndicatorMarginBottom() { return mIndicatorMarginBottom; } public int getUnderlineColor() { return mUnderlineColor; } public float getUnderlineHeight() { return mUnderlineHeight; } public int getDividerColor() { return mDividerColor; } public float getDividerWidth() { return mDividerWidth; } public float getDividerPadding() { return mDividerPadding; } public float getTextsize() { return mTextSize; } public int getTextSelectColor() { return mTextSelectColor; } public int getTextUnselectColor() { return mTextUnselectColor; } public boolean isTextBold() { return mTextBold; } public boolean isTextAllCaps() { return mTextAllCaps; } //setter and getter // show MsgTipView private Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private OnTabSelectListener mListener; public void setOnTabSelectListener(OnTabSelectListener listener) { this.mListener = listener; } public interface CustomTabProvider { View getCustomTabView(ViewGroup parent, int position); void tabSelect(View tab); void tabUnselect(View tab); } @Override protected Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); bundle.putParcelable("instanceState", super.onSaveInstanceState()); bundle.putInt("mCurrentTab", mCurrentTab); return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { Bundle bundle = (Bundle) state; mCurrentTab = bundle.getInt("mCurrentTab"); state = bundle.getParcelable("instanceState"); if (mCurrentTab != 0 && mTabsContainer.getChildCount() > 0) { updateTabSelection(mCurrentTab); scrollToCurrentTab(); } } super.onRestoreInstanceState(state); } protected int dp2px(float dp) { final float scale = mContext.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } protected int sp2px(float sp) { final float scale = this.mContext.getResources().getDisplayMetrics().scaledDensity; return (int) (sp * scale + 0.5f); } public interface OnTabSelectListener { void onTabSelect(int position); void onTabReselect(int position); } }