BasePageIndicator-ViewPager指示器
2016-01-17 18:22
459 查看
BasePageIndicator-ViewPager指示器
参考JakeWharton/ViewPagerIndicator和astuetz/PagerSlidingTabStrip的源码,感谢。初衷是想自定义个指示器,看了上述的源码,干脆自己写出来了一个通用的BasePageIndicator,自定义指示器只需重写以下方法:
getTabItemView()
drawItemUnder()
drawTabUnder()
drawDivider(),第一个方法是得到item的view,后面几个是绘制Item下划线,Tab下划线,Item间的分隔线。
TitleIndicator代码:
/** * Created by blanke on 15-12-6. */ public class TitleIndicator extends BaseIndicator { private int mTextSize = 16; private int mTextColorResId; public TitleIndicator(Context context) { this(context, null); } public TitleIndicator(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected View getTabItemView(PagerAdapter adapter, int position) { TextView view = new TextView(getContext()); view.setText(adapter.getPageTitle(position)); view.setTextSize(mTextSize); view.setGravity(Gravity.CENTER); if (mTextColorResId != 0) { view.setTextColor(getResources().getColorStateList(mTextColorResId)); } return view; } @Override protected void drawItemUnder(Canvas canvas, float left, float top, float right, float bottom, Paint paint) { if (paint != null) { canvas.drawRect(left, top, right, bottom, paint); } } @Override protected void drawTabUnder(Canvas canvas, float left, float top, float right, float bottom, Paint paint) { canvas.drawRect(left, top, right, bottom, paint); } @Override protected void drawDivider(Canvas canvas, float left, float top, float right, float bottom, Paint paint) { canvas.drawRect(left, top, right, bottom, paint); } /*.... get() set()*/ }
MIUITitleIndicator代码;
/** * Created by blanke on 15-12-6. */ public class MIUITitleIndicator extends TitleIndicator { private Path mPath; private float mSplitFactory = 4;//控制三角形的大小 private float mVerticalOffset = 5;//纵向偏移 private float r;//三角形底边长 public MIUITitleIndicator(Context context) { this(context, null); } public MIUITitleIndicator(Context context, AttributeSet attrs) { super(context, attrs); getItemUnderPaint().setPathEffect(new CornerPathEffect(3)); } @Override protected View getTabItemView(PagerAdapter adapter, int position) { final View v = super.getTabItemView(adapter, position); if (position == 0 && mPath == null) { v.post(new Runnable() { @Override public void run() { if (mPath == null) { initPath(v.getWidth()); } } }); } return v; } private void initPath(float viewWidth) { r = viewWidth / mSplitFactory; mPath = new Path(); mPath.moveTo(0, 0); mPath.lineTo(r, 0); mPath.lineTo(r / 2, -r / 2); mPath.close(); invalidate();//重绘 } @Override protected void drawItemUnder(Canvas canvas, float left, float top, float right, float bottom, Paint paint) { if (mPath != null) { canvas.save(); canvas.translate((left + right - r) / 2, bottom + mVerticalOffset); canvas.drawPath(mPath, paint); canvas.restore(); } } /*...get() set()*/ }
写的不完善,仅供参考。
github:https://github.com/Blankeer/BasePageIndicator
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories