From 5b96ddcf6904b35d8c9c231732503d7cc3830d0d Mon Sep 17 00:00:00 2001
From: xxrlzzz <837951112@qq.com>
Date: Tue, 19 Jul 2022 10:55:47 +0800
Subject: [PATCH] Add MODE_ALIGN for LinePagerIndicator
---
.../example/FixedTabExampleActivity.java | 51 +++++++++++
.../ext/indicators/CommonPagerIndicator.java | 58 ++++++++-----
.../ext/titles/WithIconTitleView.java | 84 +++++++++++++++++++
.../activity_fixed_tab_example_layout.xml | 16 ++++
.../layout/simple_title_with_icon_layout.xml | 27 ++++++
.../indicators/LinePagerIndicator.java | 8 +-
6 files changed, 221 insertions(+), 23 deletions(-)
create mode 100644 app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/titles/WithIconTitleView.java
create mode 100644 app/src/main/res/layout/simple_title_with_icon_layout.xml
diff --git a/app/src/main/java/net/lucode/hackware/magicindicatordemo/example/FixedTabExampleActivity.java b/app/src/main/java/net/lucode/hackware/magicindicatordemo/example/FixedTabExampleActivity.java
index 4ca5d5fe..2cd0a7d3 100644
--- a/app/src/main/java/net/lucode/hackware/magicindicatordemo/example/FixedTabExampleActivity.java
+++ b/app/src/main/java/net/lucode/hackware/magicindicatordemo/example/FixedTabExampleActivity.java
@@ -27,6 +27,7 @@
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView;
import net.lucode.hackware.magicindicatordemo.R;
import net.lucode.hackware.magicindicatordemo.ext.titles.ScaleTransitionPagerTitleView;
+import net.lucode.hackware.magicindicatordemo.ext.titles.WithIconTitleView;
import java.util.Arrays;
import java.util.List;
@@ -50,6 +51,7 @@ protected void onCreate(Bundle savedInstanceState) {
initMagicIndicator2();
initMagicIndicator3();
initMagicIndicator4();
+ initMagicIndicator5();
}
private void initMagicIndicator1() {
@@ -240,4 +242,53 @@ public void onPageSelected(int position) {
}
});
}
+
+
+ private void initMagicIndicator5() {
+ MagicIndicator magicIndicator = (MagicIndicator) findViewById(R.id.magic_indicator5);
+ CommonNavigator commonNavigator = new CommonNavigator(this);
+ commonNavigator.setAdapter(new CommonNavigatorAdapter() {
+
+ @Override
+ public int getCount() {
+ return mDataList.size();
+ }
+
+ @Override
+ public IPagerTitleView getTitleView(Context context, final int index) {
+ IPagerTitleView view;
+ if (index == 1) {
+ WithIconTitleView withIconTitleView = new WithIconTitleView(context);
+ withIconTitleView.setNormalColor(Color.GRAY);
+ withIconTitleView.setSelectedColor(Color.WHITE);
+ view = withIconTitleView;
+ } else {
+ SimplePagerTitleView simplePagerTitleView = new SimplePagerTitleView(context);
+ simplePagerTitleView.setNormalColor(Color.GRAY);
+ simplePagerTitleView.setSelectedColor(Color.WHITE);
+ simplePagerTitleView.setText(mDataList.get(index));
+ view = simplePagerTitleView;
+ }
+ ((View)view).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mViewPager.setCurrentItem(index);
+ }
+ });
+ return view;
+ }
+
+ @Override
+ public IPagerIndicator getIndicator(Context context) {
+ LinePagerIndicator linePagerIndicator = new LinePagerIndicator(context);
+ linePagerIndicator.setMode(LinePagerIndicator.MODE_ALIGN);
+ linePagerIndicator.setLineHeight(UIUtil.dip2px(context, 4.0));
+ linePagerIndicator.setLineWidth(UIUtil.dip2px(context, 20.0));
+ linePagerIndicator.setColors(Color.BLUE);
+ return linePagerIndicator;
+ }
+ });
+ magicIndicator.setNavigator(commonNavigator);
+ ViewPagerHelper.bind(magicIndicator, mViewPager);
+ }
}
diff --git a/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/indicators/CommonPagerIndicator.java b/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/indicators/CommonPagerIndicator.java
index 8e1385c2..c048bb72 100644
--- a/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/indicators/CommonPagerIndicator.java
+++ b/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/indicators/CommonPagerIndicator.java
@@ -23,6 +23,7 @@ public class CommonPagerIndicator extends View implements IPagerIndicator {
public static final int MODE_MATCH_EDGE = 0; // drawable宽度 == title宽度 - 2 * mXOffset
public static final int MODE_WRAP_CONTENT = 1; // drawable宽度 == title内容宽度 - 2 * mXOffset
public static final int MODE_EXACTLY = 2;
+ public static final int MODE_ALIGN_CONTENT = 3;
private int mMode; // 默认为MODE_MATCH_EDGE模式
private Drawable mIndicatorDrawable;
@@ -61,27 +62,40 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
float nextLeftX;
float rightX;
float nextRightX;
- if (mMode == MODE_MATCH_EDGE) {
- leftX = current.mLeft + mXOffset;
- nextLeftX = next.mLeft + mXOffset;
- rightX = current.mRight - mXOffset;
- nextRightX = next.mRight - mXOffset;
- mDrawableRect.top = (int) mYOffset;
- mDrawableRect.bottom = (int) (getHeight() - mYOffset);
- } else if (mMode == MODE_WRAP_CONTENT) {
- leftX = current.mContentLeft + mXOffset;
- nextLeftX = next.mContentLeft + mXOffset;
- rightX = current.mContentRight - mXOffset;
- nextRightX = next.mContentRight - mXOffset;
- mDrawableRect.top = (int) (current.mContentTop - mYOffset);
- mDrawableRect.bottom = (int) (current.mContentBottom + mYOffset);
- } else { // MODE_EXACTLY
- leftX = current.mLeft + (current.width() - mDrawableWidth) / 2;
- nextLeftX = next.mLeft + (next.width() - mDrawableWidth) / 2;
- rightX = current.mLeft + (current.width() + mDrawableWidth) / 2;
- nextRightX = next.mLeft + (next.width() + mDrawableWidth) / 2;
- mDrawableRect.top = (int) (getHeight() - mDrawableHeight - mYOffset);
- mDrawableRect.bottom = (int) (getHeight() - mYOffset);
+ switch (mMode) {
+ case MODE_MATCH_EDGE:
+ leftX = current.mLeft + mXOffset;
+ nextLeftX = next.mLeft + mXOffset;
+ rightX = current.mRight - mXOffset;
+ nextRightX = next.mRight - mXOffset;
+ mDrawableRect.top = (int) mYOffset;
+ mDrawableRect.bottom = (int) (getHeight() - mYOffset);
+ break;
+ case MODE_WRAP_CONTENT:
+ leftX = current.mContentLeft + mXOffset;
+ nextLeftX = next.mContentLeft + mXOffset;
+ rightX = current.mContentRight - mXOffset;
+ nextRightX = next.mContentRight - mXOffset;
+ mDrawableRect.top = (int) (current.mContentTop - mYOffset);
+ mDrawableRect.bottom = (int) (current.mContentBottom + mYOffset);
+ break;
+ case MODE_ALIGN_CONTENT:
+ leftX = (current.mContentRight + current.mContentLeft - mDrawableWidth) / 2;
+ nextLeftX = (next.mContentRight + next.mContentLeft - mDrawableWidth) / 2;
+ rightX = leftX + mDrawableWidth;
+ nextRightX = nextLeftX + mDrawableWidth;
+ mDrawableRect.top = (int) (getHeight() - mDrawableHeight - mYOffset);
+ mDrawableRect.bottom = (int) (getHeight() - mYOffset);
+ break;
+ case MODE_EXACTLY:
+ default:
+ leftX = current.mLeft + (current.width() - mDrawableWidth) / 2;
+ nextLeftX = next.mLeft + (next.width() - mDrawableWidth) /2;
+ rightX = current.mLeft + (current.width() + mDrawableWidth) / 2;
+ nextRightX = next.mLeft + (next.width() + mDrawableWidth) / 2;
+ mDrawableRect.top = (int) (getHeight() - mDrawableHeight - mYOffset);
+ mDrawableRect.bottom = (int) (getHeight() - mYOffset);
+ break;
}
mDrawableRect.left = (int) (leftX + (nextLeftX - leftX) * mStartInterpolator.getInterpolation(positionOffset));
@@ -140,7 +154,7 @@ public int getMode() {
}
public void setMode(int mode) {
- if (mode == MODE_EXACTLY || mode == MODE_MATCH_EDGE || mode == MODE_WRAP_CONTENT) {
+ if (mode >= MODE_EXACTLY && mode <= MODE_ALIGN_CONTENT) {
mMode = mode;
} else {
throw new IllegalArgumentException("mode " + mode + " not supported.");
diff --git a/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/titles/WithIconTitleView.java b/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/titles/WithIconTitleView.java
new file mode 100644
index 00000000..1e9cf576
--- /dev/null
+++ b/app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/titles/WithIconTitleView.java
@@ -0,0 +1,84 @@
+package net.lucode.hackware.magicindicatordemo.ext.titles;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IMeasurablePagerTitleView;
+import net.lucode.hackware.magicindicatordemo.R;
+
+public class WithIconTitleView extends FrameLayout implements IMeasurablePagerTitleView {
+ protected int mSelectedColor;
+ protected int mNormalColor;
+ private TextView mTabWithIconText;
+
+ public WithIconTitleView(@NonNull Context context) {
+ super(context);
+ initView(context);
+ }
+
+ private void initView(Context context) {
+ LayoutInflater.from(context).inflate(R.layout.simple_title_with_icon_layout, this, true);
+ mTabWithIconText = findViewById(R.id.tab_with_icon_text);
+ }
+
+ @Override
+ public int getContentLeft() {
+ return getLeft() + mTabWithIconText.getLeft();
+ }
+
+ @Override
+ public int getContentTop() {
+ return getTop();
+ }
+
+ @Override
+ public int getContentRight() {
+ return getLeft() + mTabWithIconText.getRight();
+ }
+
+ @Override
+ public int getContentBottom() {
+ return getBottom();
+ }
+
+ @Override
+ public void onSelected(int index, int totalCount) {
+ mTabWithIconText.setTextColor(mSelectedColor);
+ }
+
+ @Override
+ public void onDeselected(int index, int totalCount) {
+ mTabWithIconText.setTextColor(mNormalColor);
+ }
+
+ @Override
+ public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) {
+
+ }
+
+ @Override
+ public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) {
+
+ }
+
+ public int getSelectedColor() {
+ return mSelectedColor;
+ }
+
+ public void setSelectedColor(int selectedColor) {
+ mSelectedColor = selectedColor;
+ }
+
+ public int getNormalColor() {
+ return mNormalColor;
+ }
+
+ public void setNormalColor(int normalColor) {
+ mNormalColor = normalColor;
+ }
+
+}
diff --git a/app/src/main/res/layout/activity_fixed_tab_example_layout.xml b/app/src/main/res/layout/activity_fixed_tab_example_layout.xml
index adc708f4..1140e10c 100644
--- a/app/src/main/res/layout/activity_fixed_tab_example_layout.xml
+++ b/app/src/main/res/layout/activity_fixed_tab_example_layout.xml
@@ -56,6 +56,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java b/magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java
index 49841948..2a93feb5 100644
--- a/magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java
+++ b/magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java
@@ -26,6 +26,7 @@ public class LinePagerIndicator extends View implements IPagerIndicator {
public static final int MODE_MATCH_EDGE = 0; // 直线宽度 == title宽度 - 2 * mXOffset
public static final int MODE_WRAP_CONTENT = 1; // 直线宽度 == title内容宽度 - 2 * mXOffset
public static final int MODE_EXACTLY = 2; // 直线宽度 == mLineWidth
+ public static final int MODE_ALIGN = 3; // 直线宽度 == mLineWidth, 且尝试居中内容
private int mMode; // 默认为MODE_MATCH_EDGE模式
@@ -94,6 +95,11 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
nextLeftX = next.mContentLeft + mXOffset;
rightX = current.mContentRight - mXOffset;
nextRightX = next.mContentRight - mXOffset;
+ } else if (mMode == MODE_ALIGN) {
+ leftX = (current.mContentRight + current.mContentLeft - mLineWidth) / 2;
+ nextLeftX = (next.mContentRight + next.mContentLeft - mLineWidth) / 2;
+ rightX = leftX + mLineWidth;
+ nextRightX = nextLeftX + mLineWidth;
} else { // MODE_EXACTLY
leftX = current.mLeft + (current.width() - mLineWidth) / 2;
nextLeftX = next.mLeft + (next.width() - mLineWidth) / 2;
@@ -167,7 +173,7 @@ public int getMode() {
}
public void setMode(int mode) {
- if (mode == MODE_EXACTLY || mode == MODE_MATCH_EDGE || mode == MODE_WRAP_CONTENT) {
+ if (mode <= MODE_ALIGN) {
mMode = mode;
} else {
throw new IllegalArgumentException("mode " + mode + " not supported.");