package com.demo.tab.viewpagertab.View;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.demo.tab.viewpagertab.R;
import java.util.List;
public class PagerTab extends LinearLayout {
private Paint mPaint;
private Path mPath;
private int mInitTrangleOffsetX;
private int mTrangleOffsetX = 0;
private int mTranglePlaceX;
private int mTrangleWidth;
private int mTrangleHeight;
private final static int TAB_DEFAULT_COUNT = 4;
private int mTabCount;
private int mTabWidth;
private OnPageChangeListener mListener;
public PagerTab(Context context) {
this(context, null);
}
public PagerTab(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public PagerTab(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
getAttrs(context, attrs);
}
private void getAttrs(Context context, AttributeSet attrs) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.PagerTab);
mTabCount = array.getInt(R.styleable.PagerTab_tab_count, TAB_DEFAULT_COUNT);
}
private void init() {
mPaint = new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setPathEffect(new CornerPathEffect(6));
}
private int getScreenWidth() {
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = wm.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
defaultDisplay.getMetrics(displayMetrics);
return displayMetrics.widthPixels;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//设置三角形尺寸
mTrangleWidth = (int) (w / mTabCount * 0.18f);
mTrangleHeight = (int) (mTrangleWidth / 2 * 0.618f);
mInitTrangleOffsetX = w / mTabCount / 2 - mTrangleWidth / 2;
initPath();
}
private void initPath() {
mPath = new Path();
mPath.moveTo(0, 0);
mPath.lineTo(mTrangleWidth, 0);
mPath.lineTo(mTrangleWidth / 2, -mTrangleHeight);
mPath.close();
}
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.save();
mTranglePlaceX = mInitTrangleOffsetX + mTrangleOffsetX;
canvas.translate(mTranglePlaceX, getMeasuredHeight());
canvas.drawPath(mPath, mPaint);
canvas.restore();
super.dispatchDraw(canvas);
}
public void setOnScroll(int poistin, float offset) {
int width = getMeasuredWidth() / mTabCount;
mTrangleOffsetX = (int) (width * (poistin + offset));
if (poistin >= (mTabCount - 2) && offset > 0 && getChildCount() > mTabCount && (poistin < getChildCount() - 2)) {
if (mTabCount != 1) {
this.scrollTo(
(int) ((poistin - mTabCount + 2) * mTabWidth + mTabWidth * offset)
, 0);
} else {
this.scrollTo((int) ((poistin) * mTabWidth + mTabWidth * offset), 0);
}
}
invalidate();
}
public void setTabCount(int count) {
this.mTabCount = count;
mTabWidth = getScreenWidth() / mTabCount;
}
private List<String> mTitles;
public void setTitles(List<String> titles) {
this.mTitles = titles;
for (int i = 0; i < mTitles.size(); i++) {
final int j = i;
String title = mTitles.get(i);
TextView textView = getTextView(title);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mViewPager != null) {
mViewPager.setCurrentItem(j);
}
}
});
addView(textView);
}
setAllTextViewColor(0);
}
private final static int TEXTVIEW_LOW_COLOR = 0x77ffffff;
private final static int TEXTVIEW_HEIGHT_COLOR = 0xffffffff;
private TextView getTextView(String title) {
TextView textView = new TextView(getContext());
textView.setTextColor(TEXTVIEW_LOW_COLOR);
textView.setText(title);
textView.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
lp.weight = 0;
lp.width = getScreenWidth() / mTabCount;
textView.setLayoutParams(lp);
return textView;
}
private ViewPager mViewPager;
public interface OnPageChangeListener {
void onPageScrolled(int var1, float var2, int var3);
void onPageSelected(int var1);
void onPageScrollStateChanged(int var1);
}
public void setOnPageChangeListener(OnPageChangeListener listener) {
mListener = listener;
}
public void setViewPager(ViewPager vp) {
mViewPager = vp;
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int mI, float mV, int mI1) {
setOnScroll(mI, mV);
if (mListener != null) {
mListener.onPageScrolled(mI, mV, mI1);
}
}
@Override
public void onPageSelected(int mI) {
if (mListener != null) {
mListener.onPageSelected(mI);
}
setAllTextViewColor(mI);
}
@Override
public void onPageScrollStateChanged(int mI) {
if (mListener != null) {
mListener.onPageScrollStateChanged(mI);
}
}
});
}
private void setAllTextViewColor(int pos) {
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View childAt = getChildAt(i);
if (childAt instanceof TextView) {
((TextView) childAt).setTextColor(i == pos ? TEXTVIEW_HEIGHT_COLOR : TEXTVIEW_LOW_COLOR);
}
}
}
}
package com.demo.tab.viewpagertab;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import com.demo.tab.viewpagertab.Fragment.PagerFragment;
import com.demo.tab.viewpagertab.View.PagerTab;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends FragmentActivity {
private PagerTab mPt;
private ViewPager mVp;
private List<String> mTitles = Arrays.asList("短信1", "收藏2", "通话3", "短信4", "收藏5", "通话6", "短信7", "收藏8", "通话9");
private List<Fragment> mFragments = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initViewPager();
}
private void initViewPager() {
mPt.setTabCount(5);
mPt.setTitles(mTitles);
mPt.setViewPager(mVp);
mVp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int mI) {
return mFragments.get(mI);
}
@Override
public int getCount() {
return mFragments.size();
}
});
}
private void initData() {
for (String title : mTitles) {
PagerFragment instance = PagerFragment.getInstance(title);
mFragments.add(instance);
}
}
private void initView() {
mVp = findViewById(R.id.vp);
mPt = findViewById(R.id.pt);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.demo.tab.viewpagertab.View.PagerTab
android:id="@+id/pt"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="#444"
android:orientation="horizontal"
tab:tab_count="4">
</com.demo.tab.viewpagertab.View.PagerTab>
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>