ViewPagerIndicator和setOnPageChangeListener

时间:2014-08-04 14:27:19

标签: android android-viewpager viewpagerindicator

我想在用户更改页面时更改背景颜色,因为我需要使用ViewPager的setOnPageChangeListener。但似乎这会制动ViewPagerIndicator,因为指标卡在第一页。这是代码

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        ColorDrawable[] colors = {new ColorDrawable(backgroundColors[previousPosition]), new ColorDrawable(backgroundColors[position])};
        TransitionDrawable trans = new TransitionDrawable(colors);
        viewPager.setBackgroundDrawable(trans);
        trans.startTransition(200);
        previousPosition = position;
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {}

    @Override
    public void onPageScrollStateChanged(int arg0) {}
});

3 个答案:

答案 0 :(得分:10)

我最终使用 ViewPagerIndicator&#39> <{strong> setOnPageChangeListener代替 ViewPager 方法

mIndicator = (IconPageIndicator)findViewById(R.id.indicator);
mIndicator.setViewPager(viewPager);

代码变为:

mIndicator.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        ColorDrawable[] colors = {new ColorDrawable(backgroundColors[previousPosition]), new ColorDrawable(backgroundColors[position])};
        TransitionDrawable trans = new TransitionDrawable(colors);
        viewPager.setBackgroundDrawable(trans);
        trans.startTransition(200);
        previousPosition = position;
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {}

    @Override
    public void onPageScrollStateChanged(int arg0) {}
});

答案 1 :(得分:1)

这种改变标签之间颜色的方法是第一种方法,但我认为提出更好的方法并不困难。

在您的方法中: 我认为,在您的方法中,您正在做的是一旦选择了新页面,您就会触发背景颜色的转换。在这种情况下,转换是及时修复的(在你的情况下是200毫秒)但它感觉不自然,当你更改它们之间的页面滑动时甚至更糟。问题是onPageSelected是一个开/关触发器。您在第0页或第1页或第2页,但没有“0和1之间”这样的状态。

如果颜色与滑动量完全成正比,那就不太好了,这与标签之间的过渡中的实际状态成正比吗?

怎么做?

在托管viewpager的活动中,在视图寻呼机中设置一个布局,其中包含所需的选项卡。如果您有3个选项卡,则设置3个背景图层彼此重叠。

例如:

<LinearLayout
    android:id="@+id/background_main_fragment_activity_bottom"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_gradient_radial_blue_vivid"
    android:orientation="vertical"
    tools:visibility="visible">
</LinearLayout>

<LinearLayout
    android:id="@+id/background_main_fragment_activity_middle"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_gradient_radial_blue_samknows"
    android:orientation="vertical"
    tools:visibility="visible">
</LinearLayout>

<LinearLayout
    android:id="@+id/background_main_fragment_activity_top"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_gradient_radial_blue_light"
    android:orientation="vertical"
    tools:visibility="visible">
</LinearLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

每个LinearLayout都是特定标签的背景。

这个想法是修改线性布局的alpha值,使其可见,部分可见或不可见。

我们不会使用onPageSelected方法,而是使用onPageScrolled,看看:

// Set a listener that will be invoked whenever the page changes or is incrementally scrolled.
// This listener is used for changing smoothly the colour of the background, this is modifying the visibility of the different layers

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()
{
        // Called when the scroll state changes

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
        super.onPageScrolled(position, positionOffset, positionOffsetPixels);

        switch (position)
        {
            case 0:
                layout_ll_background_middle.setAlpha(positionOffset);
                break;

            case 1:                     
                layout_ll_background_top.setAlpha(positionOffset);
                break;

            default:
                break;
        }               
    }

    // This method will be invoked when a new page becomes selected

    @Override
    public void onPageSelected(int position)
    {       // When swiping between pages, select the corresponding tab         
            getActionBar().setSelectedNavigationItem(position);
            // Set the title    
            actionBar.setTitle(adapter_ViewPager.getPageTitle(position));       
    }           
});

希望有助于改善它。

祝你好运

答案 2 :(得分:0)

由于定时转换不太适合用例,并且不应该使用alpha(以这种方式)对于android上的转换/动画,这是我提出的:

首先要确保没有子视图的背景设置不应该在哪里。在基本布局中,将布局背景设置为起始颜色。

在您的Activity.onCreate()中添加以下内容:

final ViewPager mPager = (ViewPager) findViewById(R.id.ofYourPager);
// if you have a page indicator
final YourPageIndicator pageIndicator = (YourPageIndicator) findViewById(R.id.ofYourIndicator);

// change background on swipe
final int[] colors = {
    getResources().getColor(R.color.yourFirstColor),
    getResources().getColor(R.color.yourSecondColor),
    getResources().getColor(R.color.yourThirdColor),
    // --- add as many colours as you have pages ---
};
final ArgbEvaluator argbEvaluator = new ArgbEvaluator();
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (position < (mPagerAdapter.getCount() - 1) && position < (colors.length - 1)) {
            Integer color = (Integer) argbEvaluator.evaluate(positionOffset, colors[position], colors[position + 1]);
            mPager.setBackgroundColor(color);
            pageIndicator.setBackgroundColor(color);
        } else {
            mPager.setBackgroundColor(colors[colors.length - 1]);
            pageIndicator.setBackgroundColor(colors[colors.length - 1]);
        }
    }

    @Override
    public void onPageSelected(int position) {}

    @Override
    public void onPageScrollStateChanged(int state) {}
});

我从这篇文章中发现了这个想法:http://kubaspatny.github.io/2014/09/18/viewpager-background-transition/