OnPageChangeListener alpha 交叉淡入淡出

2023-11-25

关于 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方法。

还有另一种方法可以创建/修复此行为吗?


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

Each Fragment in the ViewPager将有这样的布局:

<?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());

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OnPageChangeListener alpha 交叉淡入淡出 的相关文章

随机推荐

  • 如何内省 Django 中的属性和模型字段?

    我正在尝试获取给定对象的所有现有模型字段和属性的列表 有没有一种干净的方法来内省对象 以便我可以获得字段和属性的字典 class MyModel Model url models TextField def get location sel
  • 将 JTextField 输入转换为 Integer

    我是 JAVA 新手 我试图将 JTextField 的输入转换为整数 我尝试了很多选项 但没有任何效果 Eclipse 总是给我一个错误 并且这些错误对我来说没有意义 导入java awt Graphics 导入java awt Colo
  • 如何访问 MediaBrowserServiceCompat 服务的实例?

    令人惊讶的是 我正在努力获取源自以下内容的服务实例 MediaBrowserServiceCompat 对于典型的服务 为了实现这一点 使用本地绑定器 class MyService extends MediaBrowserServiceC
  • Angular 5 - 在运行时动态加载模块(在编译时未知)

    Angular 5 是否可以动态加载编译时未知但运行时未知的模块 组件 我想这不会使用 webpack 工作 但也许使用 system js EDIT 整个想法是构建一个基于插件的应用程序 其中各个插件被放入插件文件夹中 Angular 将
  • 为多个按钮实现 onTouchListener() 的单一方法

    我想看看是否有一种方法可以创建一个方法来实现多个按钮的触摸侦听器 因为我有很多按钮几乎可以完成相同的操作 他们所做的唯一区别是他们通过我的 sendMessage 方法发送的消息 以及需要按住按钮多长时间才能发送消息 如果有办法做到这一点
  • JSF 2.0:如何在使用 HttpServletRequest.login 后重定向到受保护页面

    我正在尝试将 HttpServletRequest login 与基于表单的身份验证一起使用 一切都很好 容器告诉登录名 密码是否正确 除了用户输入登录名后 我不知道如何将用户重定向到他要求的受保护页面 重新显示登录表单 怎么做 在此先感谢
  • 生成 svn 中文件的更改历史记录

    是否可以生成一个文件 其中包括对某个文件所做的所有更改的摘要 什么 何时 由谁 VSS 中曾经有这样的选项 我认为它被称为 历史记录 它非常适合回溯并跟踪谁在何时进行了某些更改 顺便说一句 我正在使用 tortoisesvn 先感谢您 右键
  • fpdf 中单元格内的背景颜色没有变化

    我使用 fpdf 为我的报告生成 pdf 文件 对此我还是新手 我想更改单元格内的填充颜色 但每当我重新加载页面时 什么也没有 hapeens 它仍然是相同的白色填充颜色 这是我的代码 我的代码有什么问题吗 我按照设置填充颜色的正确方法进行
  • QQuickWindow透明

    我将 QQmlApplicationEngine 与 QQuickWindow 一起用于应用程序 但我不能 透明的主窗口 我想在应用程序弹出之前设置启动画面 并且我使用 Window 组件 它应该是透明的 但事实并非如此 我的 main c
  • iPhone - 从视频文件中分离音频并将其保存到单独的文件中

    有谁知道是否可以将音频从视频文件 例如 h 264 编码 mpeg 或其他此类格式 中分离出来 然后将该音频数据保存到单独的文件 例如 mp3 文件 中 这涉及到iPhone SDK 任何正确方向的指示将不胜感激 谢谢 听起来像是 AVFo
  • C++ 从 URL 解析主机 IP 地址

    给定 URL 如何解析主机 IP 地址Visual C 我不确定是否有特定的 C 类来执行主机名查找 但您始终可以使用纯 C 来执行此类操作 这是我的版本 可以在 Linux Mac OS X 和 Windows 上编译和运行 includ
  • Android:添加带有展开动画的视图(不闪烁)

    我想使用扩展动画将视图添加到视图组 因此添加的视图一开始非常小 并且占用越来越多的空间 直到达到其完整大小 可能会在此过程中移动其他视图 在尝试了不同的方法之后 我想出了下面的解决方案 如果对您有帮助 请投票 或者请发布更好的替代方案 我确
  • C# 比较两个对象模型中的数据

    我有一个对话框 当生成时 它会填充对象模型中的数据 此时 数据被复制并存储在 备份 对象模型中 当用户完成更改并单击 确定 关闭对话框时 我需要一种快速方法将备份对象模型与实时对象模型进行比较 如果发生任何更改 我可以为用户创建新的撤消状态
  • GCC 不使用 inc

    海湾合作委员会编译器 gcc version gcc GCC 4 8 2 不生成inc汇编指令 它实际上可能有用 例如在这个 C 程序中 int main int argc char argv int sum 0 int i for i 0
  • Spring CrudRepository findByInventoryIds(List inventoryIdList) - 相当于 IN 子句

    在 Spring CrudRepository 中 我们是否支持字段的 IN 子句 即类似于以下内容 findByInventoryIds List
  • 为什么 C# 在实现接口时不允许继承返回类型

    下面的代码在 C 中不合法是否有任何合理的原因 class X IA IB public X test Compliation Error saying that X is not IB return this interface IA I
  • 不带参数的 goBack() 和 pop() 功能相同吗?

    来自阅读文档看起来是这样 但我想我很困惑为什么在不带参数调用 pop 时没有指出它们是可以互换的 或者为什么甚至会有两个具有如此相似行为的不同函数 并且为什么 goBack 不接受要返回的屏幕数量的参数 pop 返回堆栈 区别在于 pop特
  • 如何从命令行定义 gradle 中的 teamcity['build.number'] 属性

    有没有办法从命令行定义 teamcity build number 属性 我尝试了 Pteamcity build number 1 但它不起作用 我有一个 build gradle 文件 其中包含此任务 distTar baseName
  • 如何获取安卓锁屏壁纸?

    我使用下面的代码来检索 Android 8 1 手机上的 Android 锁屏壁纸 WallpaperManager manager WallpaperManager getInstance getActivity ParcelFileDe
  • OnPageChangeListener alpha 交叉淡入淡出

    关于 Android 中的交叉淡入淡出有很多问题 但它们都包含动画 我的问题是关于使用 ViewPager 的 OnPageChangeListener 进行交叉淡入淡出 我有一个 ViewPager 它可以有无限数量的视图 但实际上使用大