ViewPagerIndicator 指示器

本文介绍如何使用ViewPagerIndicator实现平滑切换的标签导航栏效果,并提供两个具体应用实例:订单状态管理和主题页面导航。通过自定义指示器样式及ViewPager配置,确保用户体验流畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewPagerIndicator

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".order.MyOrderActivity">

<com.shizhefei.view.indicator.FixedIndicatorView
    android:id="@+id/fixedIndicatorView"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:background="@color/background" />

<View
    android:layout_width="match_parent"
    android:layout_height="@dimen/d0.5"
    android:background="@color/cutOffRule" />

<com.shizhefei.view.viewpager.SViewPager
    android:id="@+id/sViewPager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:background="@color/background" />
</LinearLayout>

主代码

package com.self.zsp.mutualhelp.order;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.self.zsp.mutualhelp.R;
import com.shizhefei.view.indicator.FixedIndicatorView;
import com.shizhefei.view.indicator.IndicatorViewPager;
import com.shizhefei.view.indicator.slidebar.TextWidthColorBar;
import com.shizhefei.view.indicator.transition.OnTransitionTextListener;
import com.shizhefei.view.viewpager.SViewPager;

import base.BaseActivity;
import fragment.order.OrderAlreadyAchieveFragment;
import fragment.order.OrderOverdueFragment;
import fragment.order.OrderUnderWayFragment;
import value.Magic;

/**
 * @decs: 我的下单
 * @date: 2018/5/4 10:42
 * @version: v 1.0
 */
public class MyOrderActivity extends BaseActivity {
    /**
     * 控件
     */
    private SViewPager sViewPager;
    private FixedIndicatorView fixedIndicatorView;
    private IndicatorViewPager indicatorViewPager;

    @Override
    protected void initContentView(Bundle savedInstanceState) {
        setContentView(R.layout.activity_my_order);
    }

    @Override
    protected void stepUI() {
        sViewPager = findViewById(R.id.sViewPager);
        fixedIndicatorView = findViewById(R.id.fixedIndicatorView);
    }

    @Override
    protected void initConfiguration() {
        setIndicator();
    }

    @Override
    protected void initData() {

    }

    @Override
    protected void startLogic() {

    }

    @Override
    protected void setListener() {
      
    }

    private void setIndicator() {
        // 指示器
        fixedIndicatorView.setOnTransitionListener(new OnTransitionTextListener().setValueFromRes(this,
                R.color.colorPrimary, R.color.fontHint,
                R.dimen.s15, R.dimen.s13));
        // 指示器下边缘
        /*fixedIndicatorView.setScrollBar(new ColorBar(this, Color.RED, 10, ScrollBar.Gravity.BOTTOM_FLOAT));*/
        // ViewPager禁滑
        sViewPager.setCanScroll(true);
        // ViewPager保留界面不重加载页数
        sViewPager.setOffscreenPageLimit(3);
        indicatorViewPager = new IndicatorViewPager(fixedIndicatorView, sViewPager);
        indicatorViewPager.setIndicatorScrollBar(new TextWidthColorBar(this,
                fixedIndicatorView, ContextCompat.getColor(this, R.color.colorPrimary), 10));
        indicatorViewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    }

    private class MyAdapter extends IndicatorViewPager.IndicatorFragmentPagerAdapter {
        private String[] tabTitles = {getString(R.string.underWay), getString(R.string.alreadyAchieve), getString(R.string.overdue)};
        private LayoutInflater inflater;

        /**
         * 构造方法
         *
         * @param fragmentManager
         */
        public MyAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
            inflater = LayoutInflater.from(getApplicationContext());
        }

        @Override
        public int getCount() {
            return tabTitles.length;
        }

        @Override
        public View getViewForTab(int position, View convertView, ViewGroup container) {
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.tab_main, container, false);
            }
            TextView textView = (TextView) convertView;
            textView.setText(tabTitles[position]);
            return textView;
        }

        @Override
        public Fragment getFragmentForPage(int position) {
            Fragment fragment = null;
            if (position == 0) {
                fragment = new OrderUnderWayFragment();
            } else if (position == 1) {
                fragment = new OrderAlreadyAchieveFragment();
            } else if (position == Magic.INT_ER) {
                fragment = new OrderOverdueFragment();
            }
            return fragment;
        }
    }
}

图文

主布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".subject.MainActivity">

    <com.shizhefei.view.viewpager.SViewPager
        android:id="@+id/sViewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/d0.5"
        android:background="@color/cutOffRule" />

    <com.shizhefei.view.indicator.FixedIndicatorView
        android:id="@+id/fixedIndicatorView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/background"
        android:paddingBottom="@dimen/d3"
        android:paddingTop="@dimen/d6" />
</LinearLayout>
tab 布局

tab_main

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    android:textSize="@dimen/s10" />
主代码
package com.self.zsp.mutualhelp.subject;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.self.zsp.mutualhelp.R;
import com.shizhefei.view.indicator.FixedIndicatorView;
import com.shizhefei.view.indicator.IndicatorViewPager;
import com.shizhefei.view.indicator.transition.OnTransitionTextListener;
import com.shizhefei.view.viewpager.SViewPager;

import base.BaseActivity;
import fragment.subject.SubjectActiveFragment;
import fragment.subject.SubjectHelpFragment;
import fragment.subject.SubjectHomeFragment;
import fragment.subject.SubjectNewsFragment;
import fragment.subject.SubjectPersonalFragment;
import joggle.TouchListener;
import value.Magic;

/**
 * @decs: 主页
 * @date: 2018/3/27 11:29
 * @version: v 1.0
 */
public class MainActivity extends BaseActivity {
    /**
     * 控件
     */
    private SViewPager sViewPager;
    private FixedIndicatorView fixedIndicatorView;
    private IndicatorViewPager indicatorViewPager;

    @Override
    protected void initContentView(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void stepUI() {
        sViewPager = findViewById(R.id.sViewPager);
        fixedIndicatorView = findViewById(R.id.fixedIndicatorView);
    }

    @Override
    protected void initConfiguration() {
        setIndicator();
    }

    @Override
    protected void initData() {

    }

    @Override
    protected void startLogic() {

    }

    @Override
    protected void setListener() {

    }

    private void setIndicator() {
        // 指示器
        fixedIndicatorView.setOnTransitionListener(new OnTransitionTextListener().setColorId(MainActivity.this, R.color.colorPrimary, R.color.fontHint));
        // ViewPager滑
        sViewPager.setCanScroll(false);
        // ViewPager保留界面不重加载页面数
        sViewPager.setOffscreenPageLimit(5);
        indicatorViewPager = new IndicatorViewPager(fixedIndicatorView, sViewPager);
        indicatorViewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    }

    private class MyAdapter extends IndicatorViewPager.IndicatorFragmentPagerAdapter {
        private String[] tabTitles = {getString(R.string.home),
                getString(R.string.active),
                getString(R.string.news),
                getString(R.string.help),
                getString(R.string.personal)};
        private int[] tabIcons = {R.drawable.home_tab_selector,
                R.drawable.active_tab_selector,
                R.drawable.news_tab_selector,
                R.drawable.help_tab_selector,
                R.drawable.personal_tab_selector};
        private LayoutInflater inflater;

        /**
         * 构造方法
         *
         * @param fragmentManager
         */
        public MyAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
            inflater = LayoutInflater.from(getApplicationContext());
        }

        @Override
        public int getCount() {
            return tabTitles.length;
        }

        @Override
        public View getViewForTab(int position, View convertView, ViewGroup container) {
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.tab_main, container, false);
            }
            TextView textView = (TextView) convertView;
            textView.setText(tabTitles[position]);
            // 布局 / 代码均可设文本大小
            // 固宽可避 TextView 大小或 Tab 宽变致 Tab 抖动
            /*textView.setTextSize(13);*/
            textView.setCompoundDrawablesWithIntrinsicBounds(0, tabIcons[position], 0, 0);
            return textView;
        }

        @Override
        public Fragment getFragmentForPage(int position) {
            Fragment fragment = null;
            if (position == 0) {
                fragment = new SubjectHomeFragment();
            } else if (position == 1) {
                fragment = new SubjectActiveFragment();
            } else if (position == Magic.INT_ER) {
                fragment = new SubjectNewsFragment();
            } else if (position == Magic.INT_S) {
                fragment = new SubjectHelpFragment();
            } else if (position == Magic.INT_SI) {
                fragment = new SubjectPersonalFragment();
            }
            return fragment;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snpmyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值