package com.com.mr_wrong.test; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.LinearLayout; public class TabBarView extends LinearLayout { public interface IconTabProvider { public int getPageIconResId(int position); } private static final int STRIP_HEIGHT = 6; public final Paint mPaint; private int mStripHeight; private float mOffset = 0f; public static int mSelectedTab = 0; public ViewPager pager; public static int tabCount; private final PageListener pageListener = new PageListener(); public OnPageChangeListener delegatePageListener; private View child; private View nextChild; public static int a; public TabBarView(Context context) { this(context, null); } public TabBarView(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.actionBarTabBarStyle); } public TabBarView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setWillNotDraw(false); mPaint = new Paint(); mPaint.setColor(Color.WHITE); mPaint.setAntiAlias(true); mStripHeight = (int) (STRIP_HEIGHT * getResources().getDisplayMetrics().density + .5f); } public void setStripColor(int color) { if (mPaint.getColor() != color) { mPaint.setColor(color); invalidate(); } } public void setStripHeight(int height) { if (mStripHeight != height) { mStripHeight = height; invalidate(); } } public void setSelectedTab(int tabIndex) { if (tabIndex < 0) { tabIndex = 0; } final int childCount = getChildCount(); if (tabIndex >= childCount) { tabIndex = childCount - 1; } if (mSelectedTab != tabIndex) { mSelectedTab = tabIndex; invalidate(); } } public void setOffset(int position, float offset) { if (mOffset != offset) { mOffset = offset; invalidate(); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // Draw the strip manually child = getChildAt(mSelectedTab); int height = getHeight(); if (child != null) { float left = child.getLeft(); //Log.e("child.getLeft()==========", child.getLeft()+""); float right = child.getRight(); if (mOffset > 0f && mSelectedTab < tabCount - 1 ) { nextChild = getChildAt(mSelectedTab + 1); if (nextChild != null) { final float nextTabLeft = nextChild.getLeft(); //Log.e("nextChild.getLeft()==========", nextChild.getLeft()+""); final float nextTabRight = nextChild.getRight(); left = (mOffset * nextTabLeft + (1f - mOffset) * left); right = (mOffset * nextTabRight + (1f - mOffset) * right); } } canvas.drawRect(left, height - mStripHeight, right, height, mPaint); } } 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(); } private class PageListener implements OnPageChangeListener { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { mSelectedTab = position; mOffset = positionOffset; //Log.e("mOffset==========", mOffset+""); invalidate(); if (delegatePageListener != null) { delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } } @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE) { } if (delegatePageListener != null) { delegatePageListener.onPageScrollStateChanged(state); } } @Override public void onPageSelected(int position) { if (delegatePageListener != null) { delegatePageListener.onPageSelected(position); } } } public void notifyDataSetChanged() { this.removeAllViews(); tabCount = pager.getAdapter().getCount(); for (int i = 0; i < tabCount; i++) { if(getResources().getConfiguration().orientation==1){ //横排 addTabViewP(i, pager.getAdapter().getPageTitle(i).toString(), ((IconTabProvider) pager.getAdapter()).getPageIconResId(i)); }else{ addTabViewL(i, pager.getAdapter().getPageTitle(i).toString(), ((IconTabProvider) pager.getAdapter()).getPageIconResId(i)); } } getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @SuppressLint("NewApi") @Override public void onGlobalLayout() { getViewTreeObserver().removeOnGlobalLayoutListener(this); mSelectedTab = pager.getCurrentItem(); } }); } /** * 横排 * @param i * @param string * @param pageIconResId */ private void addTabViewL(final int i, String string, int pageIconResId) { TabView tab = new TabView(getContext()); //tab.setIcon(pageIconResId); tab.setText(string, pageIconResId); tab.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pager.setCurrentItem(i); } }); this.addView(tab); } /** * 竖排 * @param i * @param string * @param pageIconResId */ private void addTabViewP(final int i, final String string, int pageIconResId) { final TabView tab = new TabView(getContext()); tab.setIcon(pageIconResId); tab.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pager.setCurrentItem(i); } }); //长按显示文字 CheatSheet.setup(tab, string); this.addView(tab); } public void setOnPageChangeListener(OnPageChangeListener listener) { this.delegatePageListener = listener; } }