首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewPagerIndicator和setOnPageChangeListener

ViewPagerIndicator和setOnPageChangeListener
EN

Stack Overflow用户
提问于 2014-08-04 14:27:18
回答 3查看 3.2K关注 0票数 1

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

代码语言:javascript
复制
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) {}
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-04 14:29:28

最后,我使用了ViewPagerIndicator's setOnPageChangeListener而不是ViewPager的方法

代码语言:javascript
复制
mIndicator = (IconPageIndicator)findViewById(R.id.indicator);
mIndicator.setViewPager(viewPager);

守则如下:

代码语言:javascript
复制
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) {}
});
票数 10
EN

Stack Overflow用户

发布于 2014-08-04 15:12:47

这种在标签之间改变颜色的方法是第一种方法,但我认为这并不难找到一个更好的方法。

In您的方法:,我认为在您的方法中,您要做的是,只要选择了一个新页面,就会触发背景色的转换。在这种情况下,转换是固定的(在您的例子中是200毫秒),但是当您在它们之间更改页面时,感觉不自然,甚至更糟。问题是onPageSelected是一个on/off触发器。您在第0页、第1页或第2页,但没有“0到1”这样的状态。

如果颜色与滑动量成正比,那就不是很好了,这与标签之间转换的真实状态成正比吗??

怎么做?

在承载viewpager的活动中,在视图寻呼机中设置一个具有任意多个背景层的布局。如果你有3个标签,那么设置3个背景层,互相重叠。

例如:

代码语言:javascript
复制
<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,看一看:

代码语言:javascript
复制
// 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));       
    }           
});

希望它能让它变得更好。

祝好运

票数 1
EN

Stack Overflow用户

发布于 2015-06-23 15:42:20

由于时间转换不太适合,所以不应该(以这种方式)在android上使用usecase和alpha来进行转换/动画,这是我想出的:

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

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

代码语言:javascript
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25121019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档