ViewPager 的 PagerIndicator
2015-10-12 16:21
267 查看
public class PagerIndicator extends LinearLayout implements OnPageChangeListener, OnClickListener { private List<String> mTitles; private int mTabCount; private int mTitleItemWidth; private int mLineColor; private int mSelectedTextColor; private int mNorTextColor; private int mTextSize = 17; private int mLineWidth; private Paint mLinePaint; private float mTranslationX; private ViewPager mViewPager; private List<TextView> mTextViewList; private OnViewPagerChangeListener listener; public interface OnViewPagerChangeListener{ void onPageScrolled(int position, float positionOffset,int positionOffsetPixels); } public PagerIndicator(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mLineColor = getResources().getColor(R.color.indicator_bottom_line_color); mSelectedTextColor = getResources().getColor(R.color.indicator_selected_txt_color); mNorTextColor = getResources().getColor(R.color.indicator_un_selected_txt_color); mLineWidth = DensityConverter.dp2px(getContext(), 1); mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); mLinePaint.setColor(mLineColor); mLinePaint.setStrokeWidth(mLineWidth); mLinePaint.setStrokeCap(Cap.ROUND); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if(mTitles != null && mTitles.size() > 0 ){ mTitleItemWidth = w / mTitles.size(); } } @SuppressWarnings("deprecation") public void setViewPager(ViewPager viewPager){ mViewPager = viewPager; initTitles(); initTitleItemView(); mViewPager.setOnPageChangeListener(this); } private void initTitleItemView() { mTextViewList = new ArrayList<TextView>(); if(getChildCount() > 0){ this.removeAllViews(); } for(int i = 0 ; i < mTabCount; i++){ TextView titleTv = new TextView(getContext()); LinearLayout.LayoutParams params = new LayoutParams(0, android.view.ViewGroup.LayoutParams.MATCH_PARENT); params.weight = 1; titleTv.setText(mTitles.get(i)); titleTv.setId(i); titleTv.setGravity(Gravity.CENTER); titleTv.setTextColor(i == 0 ? mSelectedTextColor : mNorTextColor); titleTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTextSize); titleTv.setLayoutParams(params); titleTv.setOnClickListener(this); addView(titleTv); mTextViewList.add(titleTv); } } private void initTitles(){ PagerAdapter adapter = mViewPager.getAdapter(); mTabCount = adapter.getCount(); mTitles = new ArrayList<String>(); for(int i = 0 ; i < mTabCount ; i++){ String title = (String) adapter.getPageTitle(i); mTitles.add(title); } } @Override public void onPageScrollStateChanged(int position) { } @Override public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) { if(null != listener){ listener.onPageScrolled(position, positionOffset, positionOffsetPixels); } mTranslationX = getWidth() / mTabCount * (position + positionOffset); for(int i = 0 ; i < mTextViewList.size() ; i++){ TextView textView = mTextViewList.get(i); if(position == i){ textView.setTextColor(mSelectedTextColor); }else{ textView.setTextColor(mNorTextColor); } } invalidate(); } @Override public void onPageSelected(int state) {} //绘制下划线 @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); canvas.save(); canvas.translate(mTranslationX, getHeight() - mLineWidth / 2); canvas.drawLine(0, 0, mTitleItemWidth, 0, mLinePaint); canvas.restore(); } @Override public void onClick(View v) { int id = v.getId(); mViewPager.setCurrentItem(id); } public void setOnViewPagerChangeListener(OnViewPagerChangeListener l) { this.listener = l; } }
核心代码:
计算需要移动的距离
mTranslationX = getWidth() / mTabCount * (position + positionOffset); for(int i = 0 ; i < mTextViewList.size() ; i++){ TextView textView = mTextViewList.get(i); if(position == i){ textView.setTextColor(mSelectedTextColor); }else{ textView.setTextColor(mNorTextColor); } } invalidate();
绘制背景
@Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); canvas.save(); canvas.translate(mTranslationX, getHeight() - mLineWidth / 2); canvas.drawLine(0, 0, mTitleItemWidth, 0, mLinePaint); canvas.restore(); }
相关文章推荐
- 关于操作栏actionBar的添加移除总结
- 【日常学习】【二分】【最长不下降子序列长度】codevs4214 [Mz]品尝美食题解
- linux命令行快捷键
- Linux基础(二)fork()进程
- Android Studio系列教程四--Gradle基础
- 输入流和输出流同时操作一个文件的问题
- 源码安装postgresql
- Android中UID机制和共享进程
- 测试工作--一年总结
- 如何将Nios II硬件和软件合成一个文件(NIOS II)(硬件)(软件)(合并)
- ListView、ScrollView中嵌套的EditText不能滚动的问题
- linux备忘
- vijosP1359 Superprime
- linux 安装rz sz
- 8位CRC 数据校验
- 第六周项目1-建立顺序栈算法库
- Android ImageCropper 矩形 圆形 裁剪框
- Android Binder设计与实现 – 设计篇(二)
- oracle视图
- 软件测试管理