gpt4 book ai didi

android - OnPageChangeListener alpha 淡入淡出

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:49:27 26 4
gpt4 key购买 nike

关于 Android 中的淡入淡出的问题有很多,但它们都包括动画。我的问题是关于使用 ViewPager 的 OnPageChangeListener 进行淡入淡出。

我有一个 ViewPager,它可以有无限数量的 View ,但实际上使用了大约 6 或 7 个 View 。那里没什么进展。

ViewPager 中的每个 View 都有一个背景位图,它应该固定并与下一个(或上一个) View 的背景交叉淡入淡出,而不是与 View 的其余部分一起滚动。

为了实现这一点,我将背景解耦并添加到 ArrayList 中,稍后将它们分配给 ImageViews。但是,由于我不想冒这样的风险,即我的 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>

然后将 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 方法。

有没有其他方法可以创建/修复此行为?

最佳答案

ViewPager.PageTransformer是你的 friend 。我将对您尝试的方法采取不同的方法,但据我所知,它会产生您想要的结果 - 向左/向右滑动会滑动内容,但会在两个不动的背景图像之间淡出。

ViewPager 中的每个 Fragment 都将具有如下布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_view"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center" />
<LinearLayout
android:id="@+id/content_area"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- content goes here -->
</LinearLayout>
</FrameLayout>

然后您将创建一个 PageTransformer,它根据滑动的位置来操纵布局:

public class CustomPageTransformer implements ViewPager.PageTransformer {
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
View imageView = view.findViewById(R.id.image_view);
View contentView = view.findViewById(R.id.content_area);

if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left
} else if (position <= 0) { // [-1,0]
// This page is moving out to the left

// Counteract the default swipe
view.setTranslationX(pageWidth * -position);
if (contentView != null) {
// But swipe the contentView
contentView.setTranslationX(pageWidth * position);
}
if (imageView != null) {
// Fade the image in
imageView.setAlpha(1 + position);
}

} else if (position <= 1) { // (0,1]
// This page is moving in from the right

// Counteract the default swipe
view.setTranslationX(pageWidth * -position);
if (contentView != null) {
// But swipe the contentView
contentView.setTranslationX(pageWidth * position);
}
if (imageView != null) {
// Fade the image out
imageView.setAlpha(1 - position);
}
} else { // (1,+Infinity]
// This page is way off-screen to the right
}
}
}

最后将这个 PageTransformer 连接到您的 ViewPager:

mViewPager.setPageTransformer(true, new CustomPageTransformer());

我已经在现有应用中对其进行了测试,只要 fragment 布局具有透明背景,它就可以正常工作。

关于android - OnPageChangeListener alpha 淡入淡出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23433027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com