我想在用户更改页面时更改背景色,因为我需要使用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) {}
});发布于 2014-08-04 14:29:28
最后,我使用了ViewPagerIndicator's 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) {}
});发布于 2014-08-04 15:12:47
这种在标签之间改变颜色的方法是第一种方法,但我认为这并不难找到一个更好的方法。
In您的方法:,我认为在您的方法中,您要做的是,只要选择了一个新页面,就会触发背景色的转换。在这种情况下,转换是固定的(在您的例子中是200毫秒),但是当您在它们之间更改页面时,感觉不自然,甚至更糟。问题是onPageSelected是一个on/off触发器。您在第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));
}
});希望它能让它变得更好。
祝好运
发布于 2015-06-23 15:42:20
由于时间转换不太适合,所以不应该(以这种方式)在android上使用usecase和alpha来进行转换/动画,这是我想出的:
首先,确保没有子视图设置了不应该设置的背景。在基本布局中,将布局的背景设置为起始颜色。
在您的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/
https://stackoverflow.com/questions/25121019
复制相似问题