ViewPager 的 PagerIndicator
来源:互联网 发布:安卓模拟windows镜像 编辑:程序博客网 时间:2024/06/12 01:10
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);}@Overrideprotected 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);}}@Overridepublic void onPageScrollStateChanged(int position) {}@Overridepublic 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();}@Overridepublic void onPageSelected(int state) {}//绘制下划线@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);canvas.save();canvas.translate(mTranslationX, getHeight() - mLineWidth / 2);canvas.drawLine(0, 0, mTitleItemWidth, 0, mLinePaint);canvas.restore();}@Overridepublic 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();
绘制背景
@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);canvas.save();canvas.translate(mTranslationX, getHeight() - mLineWidth / 2);canvas.drawLine(0, 0, mTitleItemWidth, 0, mLinePaint);canvas.restore();}
0 0
- ViewPager 的 PagerIndicator
- Android 自制ViewPager的指示器PagerIndicator
- 配合viewpager使用的指示器PagerIndicator
- 使用PagerIndicator的问题
- Android自定义Viewpager指示器PagerIndicator-仿微博头条效果
- 自定义ViewPager和弹性圆PagerIndicator
- 使用pagerIndicator+fragment+viewPager构建常用界面框架
- ViewPager中ViewPager的使用
- ViewPager 嵌套 ViewPager的解决方法
- ViewPager和ViewPager的冲突
- ViewPager嵌套ViewPager的问题
- viewpager的fragment嵌套viewpager的问题
- 解决viewpager嵌套scrowllview或者viewpager嵌套viewpager的问题
- 解决viewpager嵌套viewpager,子viewpager无法滑动的问题
- ViewPager嵌套ViewPager,里层的viewpager无法滑动
- ViewPager+FragmentPagerAdapter跟ViewPager+FragmentStatePagerAdapter的区别
- viewpager-----View作为ViewPager的数据源(PagerAdapter)
- ViewPager嵌套ViewPager滑动问题的解决
- 分组对列扁平化(列转换行 关系型转换NoSQL)
- 牛客网 | 二叉树的镜像
- yii学习笔记-代码流程
- ListView、ScrollView中嵌套的EditText不能滚动的问题
- 如何将Nios II硬件和软件合成一个文件(NIOS II)(硬件)(软件)(合并)
- ViewPager 的 PagerIndicator
- 关于操作栏actionBar的添加移除总结
- Android Studio系列教程四--Gradle基础
- 源码安装postgresql
- Linux基础(二)fork()进程
- 测试工作--一年总结
- Shiro的Realm
- 项目3 -- 单链表的应用(2)
- 第六周 项目3-括号的匹配