Android 中关于淡入淡出的问题有很多,但都包括动画。我的问题是关于使用 ViewPager 的 OnPageChangeListener 进行淡入淡出。
我有一个 ViewPager 可以有无限数量的视图,但实际上使用大约 6 或 7 个视图。那里没有太多事情发生。
ViewPager 中的每个视图都有一个背景位图,它应该固定并与下一个(或上一个)视图的背景交叉淡入淡出,而不是与视图的其余部分一起滚动。
为了实现这一点,我将背景解耦并添加到 ArrayList 并稍后将它们分配给 ImageViews。但是由于我不想冒险让我的 Activity 最终得到许多 ImageViews,所以我想到了以下结构:
<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>
然后将 aOnPageChangeListener
分配给 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
方法的方式而发生的。
还有另一种方法可以创建/修复此行为吗?