关于 Android 中的交叉淡入淡出有很多问题,但它们都包含动画。我的问题是关于使用 ViewPager 的 OnPageChangeListener 进行交叉淡入淡出。
我有一个 ViewPager,它可以有无限数量的视图,但实际上使用大约 6 或 7 个视图。那里没有发生太多事情。
ViewPager 中的每个视图都有一个背景位图,该位图应该固定并与下一个(或上一个)视图的背景交叉淡入淡出,而不是与视图的其余部分一起滚动。
为了实现这一点,我将背景解耦并添加到 ArrayList 中,然后将它们分配给 ImageView。但由于我不想冒我的 Activity 最终会出现大量 ImageView 的风险,所以我想到了以下结构:
<FrameLayout
android:id="@+id/backgroundContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/bottomImage"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center" />
<ImageView
android:id="@+id/middleImage"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center" />
<ImageView
android:id="@+id/topImage"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center" />
</FrameLayout>
Then a OnPageChangeListener
分配给 ViewPager 以将背景分配给 ImageView。
@Override
public void onPageSelected(int position) {
MyLog.i(TAG, "PAGE SELECTED: " + position);
if(position == 0) {
_bottomBackground.setImageBitmap(null);
_topBackground.setImageBitmap(_backgroundStack.get(position+1));
} else if (position == NUM_ITEMS-1) {
_bottomBackground.setImageBitmap(_backgroundStack.get(position-1));
_topBackground.setImageBitmap(null);
} else {
_bottomBackground.setImageBitmap(_backgroundStack.get(position-1));
_topBackground.setImageBitmap(_backgroundStack.get(position+1));
}
_middleBackground.setImageBitmap(_backgroundStack.get(position));
// Make the top front background transparent
_topBackground.setAlpha(0f);
_currentBackgroundPosition = position;
}
如果我只想交换背景,这很好用。我希望当用户滑动 ViewPager 时背景相互淡入淡出。我已经实现了向前滚动的淡入淡出工作,但我不明白为什么向后滚动的淡入淡出在某种程度上没有给出好的结果。在向后滚动期间,中间背景应淡入底部背景。
我担心我错过了一些东西。我从不更改底部背景的 alpha,但日志结果始终显示完全相同的值getAlpha()
至于中间的背景。
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(_currentBackgroundPosition == position) {
// scroll forward
_topBackground.setAlpha(positionOffset)
} else {
//scroll backward
_middleBackground.setAlpha(positionOffset);
}
MyLog.i(TAG, "Bottom BackgroundAlpha: " + _bottomBackground.getAlpha());
MyLog.i(TAG, "Middle BackgroundAlpha: " + _middleBackground.getAlpha());
MyLog.i(TAG, "Top BackgroundAlpha: " + _topBackground.getAlpha());
}
等等!还有一件事我真的不知道如何解决。尽管向前滚动淡入淡出正在起作用。背景中有一个超短的闪烁。我认为发生这种情况是因为我设置的方式onPageSelected
方法。
还有另一种方法可以创建/修复此行为吗?