在安卓开发中,是否遇见过一些很酷的视差动画效果,当ViewPager滑动下一页的时候,页面内的各种元素也能跟随滑动做位移效果,整体看起来非常有活力。

关键的PageTransformer

PageTransformer的用途这里就不展开了,相信做Android开发的都经常使用它实现ViewPager的各种切换效果。

public void transformPage(@NonNull View view, float position)

关键点就是PageTransformer的函数,这里详细讲解一下他们两个参数:

view:是应用变换的View,可以对View或子View进行动画,例如从第一页滑动到第二页,会将第一页的View和第二页的View分别传入,即调用了两次。

position:View的当前位置,其位置信息是一个范围值: -1 --- 0 --- 1,-1是前一个View的位置,0是当前View的位置,1是后一个View的位置。

手指往右滑动:当前View从0到1变化,前一个View从-1到0变化。

手指往左滑动:当前View从0到-1变化,后一个View从1到0变化。

子View进行位移操作

核心:根据上面的positon,在应用变换的时候,在view查找出子View,对子View应用各种操作(例如偏移)等等,就能显示出跟随手指滑动的视差效果。

大概的代码例子如下:

uiGuidePager.setPageTransformer(true, new ViewPager.PageTransformer() {
            @Override
            public void transformPage(@NonNull View view, float v) {
                View uitestOne = view.findViewById(R.id.uitestOne);
                View uiOneLogo = view.findViewById(R.id.uiOneLogo);
                View uiOneDevice = view.findViewById(R.id.uiOneDevice);
                View uiOneTip = view.findViewById(R.id.uiOneTip2);
                View uiOneTouch = view.findViewById(R.id.uiOneTouch);
                if (uitestOne != null) {
                    Log.e(">>>>", v + "");
                    uitestOne.setTranslationX(400 * v);
                    uiOneLogo.setTranslationX(50 * v);
                    uiOneDevice.setTranslationX(50 * v);
                    uiOneTip.setTranslationX(200 * v);
                    uiOneTouch.setTranslationX(200 * v);
                }
            }
        });

(扩展) 画廊视觉效果

在实现视差动画效果的同时,也可以叠加画廊视觉效果,用ViewPager实现画廊视觉效果,加上视差动画效果,滑动的时候每一页内部的元素会跟随滑动进行动画位移,视觉就更加炫。

画廊视觉效果的步骤实现是比较简单:

1)在XML中设置设置ViewPager的宽度小于父布局,留出空间展示两边页面的内容。

2)设置ViewPager的clipChildren为false,让ViewPager两边页面的内容绘制显示出来。

3)代码中设置viewPager.setPageMargin(10),设置相邻页面的间距。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.anbang.family.surface.impl.guide.GuideActivity">

    <android.support.v4.view.ViewPager
        android:clipChildren="false"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:id="@+id/uiGuidePager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

</android.support.constraint.ConstraintLayout>
viewPager.setPageMargin(30);

(相关)ViewPager2

在ViewPager2上使用视差动画效果的原理是一样的,ViewPager2一样提供了完全一致的PageTransformer,所以切换到ViewPager2时可以直接复用动画的代码,迁移零成本。

【安卓高级】ViewPager视差动画效果的更多相关文章

  1. Swift - 用UIScrollView实现视差动画效果

    Swift - 用UIScrollView实现视差动画效果 效果 源码 https://github.com/YouXianMing/Swift-Animations // // MoreInfoVi ...

  2. Android ViewPager+属性动画 实现炫酷视差动画效果

    ViewPager有一个setPageTransform()方法可以实现很多酷炫的动画效果 先来个仿QQ的侧滑面板效果 vp.setPageTransformer(true, new PageTran ...

  3. ViewPager切换动画效果改动

    比方我们点击向右button,希望左边的view移动过来,有个平移效果,可是用系统默认的ViewPager切换的时候,会一闪而过. 这是为什么呢? 由于viewpager外面事实上有个scrollvi ...

  4. Android:ViewPager 切换动画效果

    ViewPager 可以设置不同页面切换效果,通过方法 setPageTransformer(boolean reverseDrawingOrder, PageTransformer transfor ...

  5. Android开发之ViewPager实现多页面切换及动画效果(仿Android的Launcher效果)

    Android开发中经常会有引导页或者切换页面等效果,本文采用ViewPager结合动画效果来实现仿Launcher以及页面切换的效果.源码地址在文章最后给出下载. 效果图如下:       1.Vi ...

  6. 【笔记】WPF实现ViewPager引导界面效果及问题汇总

    最近在开发项目的首次使用引导界面时,遇到了问题,引导界面类似于安卓手机ViewPager那样的效果,希望通过左右滑动手指来实现切换不同页面,其间伴随动画. 实现思路: 1.界面布局:新建一个UserC ...

  7. 高级UI-自定义动画框架

    有的时候会需要做一些自定义的动画效果,在会反复用到的动画效果可以考虑做成动画框架,方便使用,做成框架的话就需要考虑很多的问题,最典型的问题就是属性和方法必须要是可配置的,这里就来聊一聊自定义动画框架的 ...

  8. Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)

    学习内容来自“慕课网” 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果 先看布局文件 activity_main.layout <?xml versi ...

  9. 转:Android ViewPager多页面滑动切换以及动画效果

    一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式, 白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了 ...

随机推荐

  1. Cookie,Session,Token详解

    Cookie,Session,Token详解 Cookie : ​ 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能. ​ Cookie由服务器生成,发 ...

  2. K number(思维和后缀以及3的特性)(2019牛客暑期多校训练营(第四场))

    示例1: 输入:600 输出:4 说明:'600', '0', '0', '00' are multiples of 300. (Note that '0' are counted twice bec ...

  3. Git学习记录(一)

    本篇文章介绍Git的本地使用 Git是什么? Git是世界上最先进的分布式版本控制系统. 那么什么是版本控制系统? 我们来举个例子,假设我创建了一个项目Project.1,里面写了一个README.t ...

  4. docker 实践五:端口映射和容器互联

    本篇是关于 docker 容器的端口映射和容器之间的互联内容. 注:环境为 CentOS7,docker 19.03. docker 的容器除了能连接网络外,在许多时候,我们需要让多个容器来协同完成任 ...

  5. 手动编译ts的经过

    动机 以前写ts或者es6,都是用在脚手架搭建的项目中,比如vue和react,当时当我识图写一个ts的demo的,我还要创建一个完整的vue或者react项目?明显不合适,那就要研究一下如何手动搭建 ...

  6. Consul微服务的配置中心体验篇

    Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性 Consul Consul 是 HashiCorp 公 ...

  7. PEB TEB结构体使用

    PEB TEB结构体使用一个可执行文件被OS加载到内存,并处理完成相关的模块加载,导入表处理……及其他必须处理后,形成一个进程.在OS内核中保存有一份关于这个进程的身份证信息,就是平常看到的HANDL ...

  8. 获取ApplicationContext进而获取Ioc实例方法

    在正常情况下 spring管理的类可直接调用Ioc容器中的实例,但在一些特殊情况下(例如拦截器中获取dao实例),Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该B ...

  9. Flask无法访问(127.0.0.1:5000)的问题解决方法

    Flask默认开启的ip地址是:http://127.0.0.1:5000/ 但在运行时可能存在无法访问的问题,特别是当我们在linux服务器上搭建flask时,此时需要将代码修改如下: app.ru ...

  10. 关于使用sublime的一些报错异常退出的解决方法

    1.我用Sublime Text 3,装了一些插件,现在一打开软件就提示plugin_host has exited unexpectedly,如下图 解决方案 :