自定义ViewPagerIndicator

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>
发布了75 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_40387150/article/details/94438643