Guest User

Untitled

a guest
Feb 15th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. package bakerj.flexibleunderlinepageindicator;
  2.  
  3. import android.content.Context;
  4. import android.content.res.TypedArray;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.support.v4.view.ViewPager;
  9. import android.util.AttributeSet;
  10. import android.view.View;
  11.  
  12. import java.util.ArrayList;
  13. import java.util.List;
  14.  
  15. /**
  16. * @author BakerJ
  17. */
  18. public class FlexibleUnderlinePageIndicator extends View {
  19. private int height;
  20. private int size;
  21. private int currentPage;
  22. private int scrollState;
  23. private float positionOffset;
  24. private List<int[]> centerWidthPairs;
  25. private int[] positionOffsets, widthOffsets;
  26. private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  27.  
  28. public FlexibleUnderlinePageIndicator(Context context) {
  29. this(context, null);
  30. }
  31.  
  32. public FlexibleUnderlinePageIndicator(Context context, AttributeSet attrs) {
  33. super(context, attrs);
  34. paint.setStyle(Paint.Style.FILL);
  35. if (attrs != null) {
  36. initAttrs(context, attrs);
  37. } else {
  38. paint.setColor(Color.LTGRAY);
  39. }
  40. }
  41.  
  42. private void initAttrs(Context context, AttributeSet attrs) {
  43. TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable
  44. .FlexibleUnderlinePageIndicator);
  45. paint.setColor(typedArray.getColor(R.styleable.FlexibleUnderlinePageIndicator_underlineColor,
  46. Color.CYAN));
  47. }
  48.  
  49. @Override
  50. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  51. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  52. height = getMeasuredHeight();
  53. }
  54.  
  55. /**
  56. * set the viewpager associate with the indicator
  57. * @param viewPager viewpager
  58. */
  59. public void setViewPager(ViewPager viewPager) {
  60. viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  61. @Override
  62. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  63. currentPage = position;
  64. FlexibleUnderlinePageIndicator.this.positionOffset = positionOffset;
  65. invalidate();
  66. }
  67.  
  68. @Override
  69. public void onPageSelected(int position) {
  70. if (scrollState == ViewPager.SCROLL_STATE_IDLE) {
  71. currentPage = position;
  72. positionOffset = 0;
  73. invalidate();
  74. }
  75. }
  76.  
  77. @Override
  78. public void onPageScrollStateChanged(int state) {
  79. scrollState = state;
  80. }
  81. });
  82. }
  83.  
  84. /**
  85. * set the tabs
  86. * @param views tabs
  87. */
  88. public void setUnderLineView(View... views) {
  89. size = views.length;
  90. centerWidthPairs = new ArrayList<>();
  91. for (final View view : views) {
  92. view.post(new Runnable() {
  93. @Override
  94. public void run() {
  95. int width = view.getWidth();
  96. int[] centerWidthPair = {view.getLeft() + width / 2, width};
  97. centerWidthPairs.add(centerWidthPair);
  98. if (size == centerWidthPairs.size()) {
  99. positionOffsets = new int[size - 1];
  100. widthOffsets = new int[size - 1];
  101. for (int i = 1; i < size; i++) {
  102. int[] centerWidthPair0 = centerWidthPairs.get(i - 1);
  103. int[] centerWidthPair1 = centerWidthPairs.get(i);
  104. positionOffsets[i - 1] = centerWidthPair1[0] - centerWidthPair0[0];
  105. widthOffsets[i - 1] = centerWidthPair1[1] - centerWidthPair0[1];
  106. }
  107. invalidate();
  108. }
  109. }
  110. });
  111. }
  112. }
  113.  
  114. @Override
  115. protected void onDraw(Canvas canvas) {
  116. if (size == centerWidthPairs.size()) {
  117. int[] centerWidthPair = centerWidthPairs.get(currentPage);
  118. float drawCenter = centerWidthPair[0];
  119. float drawWidth = centerWidthPair[1];
  120. if (positionOffset != 0) {
  121. int offsetIndex = positionOffset > 0 ? currentPage : currentPage - 1;
  122. if (offsetIndex >= 0 && offsetIndex < size - 1) {
  123. drawCenter += positionOffsets[offsetIndex] * positionOffset;
  124. drawWidth += widthOffsets[offsetIndex] * positionOffset;
  125. }
  126. }
  127. drawWidth *= 0.5f;
  128. canvas.drawRect(drawCenter - drawWidth, 0, drawCenter + drawWidth, height, paint);
  129. }
  130. }
  131. }
Add Comment
Please, Sign In to add comment