滚动时更改 Tablayout 背景颜色

Change Tablayout Background Color While Scrolling

我正在开发一个有 3 个选项卡的 android 应用程序。我正在使用 TabLayoutViewPager。我计划在 3 个不同的选项卡上为 AppBar 和 TabLayout 提供 3 种不同的背景颜色。在通过滚动或单击选项卡更改选项卡时,我需要在颜色之间进行平滑过渡。你如何进行这种转变?有人可以帮助我吗?

我做样品。希望这有帮助。

在你的Activity中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);

    int[] colors = {Color.RED, Color.GREEN, Color.BLUE};
    viewPager.setAdapter(new MyAdapter());
    viewPager.addOnPageChangeListener(new HeaderColorChanger(tabLayout, colors));
    tabLayout.setupWithViewPager(viewPager);
}

MyAdapter 是这样的:

class MyAdapter extends PagerAdapter {

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        TextView view = (TextView) LayoutInflater
                .from(container.getContext())
                .inflate(R.layout.row_item, container, false);
        container.addView(view);
        view.setText("Page:" + position);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Page:" + position;
    }
}

HeaderColorChanger 是这样的:

class HeaderColorChanger implements ViewPager.OnPageChangeListener {

    private ArgbEvaluator argbEvaluator = new ArgbEvaluator();
    private View mView;
    private int[] mColors;

    HeaderColorChanger(View view, int[] colors) {
        mView = view;
        mColors = colors;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        mView.setBackgroundColor(getHeaderColor(position, positionOffset));
    }

    @Override
    public void onPageSelected(int position) {
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    private int getHeaderColor(int position, float positionOffset) {
        if (position == mColors.length - 1) {
            return mColors[position];
        }
        int startColor = mColors[position];
        int endColor = mColors[position + 1];
        int color = (int) argbEvaluator.evaluate(positionOffset, startColor, endColor);
        return color;
    }
}