在Android中,关于交叉淡入淡出有很多问题,但它们都包括动画。我的问题是关于使用ViewPager的OnPageChangeListener进行交叉淡入淡出。
我有一个ViewPager,它可以拥有无限数量的视图,但在实际使用中只使用了大约6或7个视图。没有太多的事情发生。
ViewPager中的每个视图都有一个背景位图,应该固定并与下一个(或前一个)视图的背景进行交叉淡入淡出,而不是随着其余视图一起滚动。
为了实现这一点,我将背景解耦并添加到ArrayList中,稍后再将它们分配给ImageViews。但是,由于我不想冒险让我的Activity最终拥有众多的ImageViews,因此我考虑了以下结构:
然后,将一个
这个方案可以很好地实现背景交换。我希望在用户滑动ViewPager时,背景可以淡入淡出。我已经成功实现了向前滚动的淡入效果,但是我不明白为什么向后滚动的淡入效果总是不理想。在向后滚动期间,中间的背景应该淡入到底部的背景中。
我担心我漏掉了什么。我从未改变底部背景的alpha值,但Log结果始终显示与中间背景相同的
我有一个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>
然后,将一个
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值,但Log结果始终显示与中间背景相同的
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
方法造成的。
是否有其他方法来创建/修复这种行为?