搞了大半个月凑合着叠层效果


开源代码地址:https://gitee.com/lc951/my-android

这里使用的是viewpager + cardView组件。全部是原生组件几乎没有自定义组件。
动画效果使用的是viewpager自带的接口类ViewPager.PageTransformer,官方有两个例子也有许多博主解析过原理参考里会有笔者觉得不错的博客访问链接,有兴趣可以看看哈!

如果读者大佬留心会发现我打算写一个专题为《大前端极简开发入门》,笔者本人的风格也是简约风。所以也就不啰嗦viewpager中ViewPager.PageTransformer的动画原理和底层实现计算,实在是就算讲了也需要很长的时间来理解里面的一些很专业且晦涩难懂的实现原理。如果实在是想搞清楚可以多看看笔者留下的参考链接。

动画效果有:缩放、移动、透明度设置;单个或多个叠加即可达到动画效果

第一步:把原本左右滑动的pager页面固定到同一个位置

代码如下:

 public void transformPage(@NonNull View page, float position) {//设置透明度
//        page.setAlpha(0.5f);//设置每个View在中间,即设置相对原位置偏移量page.setTranslationX((-page.getWidth() * position));}

viewpager设置代码如下:

 CardOverlayTransformer transformer=new CardOverlayTransformer();
vp.setPageTransformer(true, transformer);

如上图看上去就是这样哈!上面是一个对比效果暂时不用搭理
接着把透明度效果加上

三张图片就叠加到一起了。

第二步:加竖向移动(竖向移动比较好理解,不涉及左右滑动的计算因素)

public class CardOverlayTransformer implements ViewPager.PageTransformer{private float mOffset = 40;@Overridepublic void transformPage(@NonNull View page, float position) {//设置透明度page.setAlpha(0.5f);//设置每个View在中间,即设置相对原位置偏移量page.setTranslationX((-page.getWidth() * position));//移动Y轴坐标page.setTranslationY(position * mOffset);}
}

效果图如下:

这个时候左右滑动还是无效
接着加position参数处理

public class CardOverlayTransformer implements ViewPager.PageTransformer{private float mOffset = 40;@Overridepublic void transformPage(@NonNull View page, float position) {//设置透明度page.setAlpha(0.5f);if(position<=0){//移动到左侧区域的pager页面}else{//移动到右侧的pager页面//设置每个View在中间,即设置相对原位置偏移量page.setTranslationX((-page.getWidth() * position));//移动Y轴坐标page.setTranslationY(position * mOffset);}}
}

上面是系统自带动画效果,下面是自定义动画效果作对比就很有眼感了
这里需要说明position的作用,参考其他博客position是页面数量决定的。大致上是[-pager页数,+pager页数];后面那个+号有些多余哈!不过还是加上进行对比。因为本博客就是一个用对比来实现效果的。可见的区域是[-1,0,1]这个范围的。这个是笔者加了限制参数viewPager.setOffscreenPageLimit(3)

第三步:进行缩放

代码如下:


public class CardOverlayTransformer implements ViewPager.PageTransformer{private float mOffset = 40;@Overridepublic void transformPage(@NonNull View page, float position) {//设置透明度page.setAlpha(0.5f);if(position<=0){//移动到左侧区域的pager页面}else{//移动到右侧的pager页面//设置每个View在中间,即设置相对原位置偏移量page.setTranslationX((-page.getWidth() * position));//移动Y轴坐标page.setTranslationY(position * mOffset);//缩放卡片并调整位置float scale = (page.getWidth() + mOffset * position) / page.getWidth();page.setScaleX(scale);page.setScaleY(scale);}}
}

效果如下:

到这里基本动画效果就加满了。接着就是调试动画相关参数和左右滑动时position变化的相关逻辑
其中的过程就不累赘了
竖向卡片叠加层次实现如下:

 Log.i(TAG, "position =" + position);
//        page.setAlpha(0.5f);if (mViewPager == null) {mViewPager = (ViewPager) page.getParent();}int current=mViewPager.getCurrentItem();Log.i(TAG,"current="+current);int pageWidth = page.getWidth();int pageHeight = page.getHeight();
//page.setPivotX(pageWidth / 2);if(position<=0){page.setTranslationX(-position * page.getWidth());//缩放卡片并调整位置float scale = (page.getWidth() + mOffset * position) / page.getWidth();page.setScaleX(scale);page.setScaleY(scale);page.setTranslationY((position) * mOffset+2.5f*current*mOffset);page.setTranslationZ(position);page.setPivotY(-1.5f*pageHeight);}else{//移动X轴坐标,使得卡片在同一坐标page.setTranslationX(-position * page.getWidth());//缩放卡片并调整位置float scale = (page.getWidth() - mOffset * position) / page.getWidth();page.setScaleX(scale);page.setScaleY(scale);//移动Y轴坐标page.setTranslationY((position) * mOffset+2.5f*current*mOffset);page.setTranslationZ(-position);page.setPivotY(1.5f*pageHeight);}}

效果如下:

横向的就不啰嗦了,参考开源项目里代码即可。
补充一下布局和相关设置
viewpager 布局文件

<android.support.v4.view.ViewPagerandroid:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="wrap_content"tools:background="#55ff0000"app:layout_constraintTop_toTopOf="parent"android:importantForAccessibility="no"tools:ignore="MissingConstraints"android:clipToPadding="false"android:clipChildren="false"android:layout_margin="10dp"android:layout_gravity="left"/>

注意设置: android:clipToPadding =false;android:clipChildren=false;这个是为了一屏多页设置的效果,目的是展示viewpager边界以外和padding都可见画面。

cardview

<android.support.v7.widget.CardViewandroid:id="@+id/card_view"android:layout_width="278dp"android:layout_height="157dp"app:cardBackgroundColor="#ffffff"app:cardCornerRadius="8dp">。。。。</android.support.v7.widget.CardView>

viewpager 相关设置

viewPager.setOffscreenPageLimit(3);

结语

就不再啰嗦了,想要调试出UI设计的效果,估计会把这篇博客看个三遍以上,都是同行懂其中的痛。
读者大佬如果看得上请收藏开源项目,笔者争取搞出100个页面特效来以后就不用像现在这样一搞动画差点搞个把月还熬五六个深夜。如果累了就先喝口水。

参考:

https://www.imooc.com/article/274387
http://crazysunj.com/2017/06/25/%E4%B8%80%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0ViewPager%E5%8D%A1%E7%89%87%E6%95%88%E6%9E%9C/
https://blog.csdn.net/chuyouyinghe/article/details/118611973
https://blog.csdn.net/qq_21793463/article/details/52225502
https://blog.csdn.net/qq_33229171/article/details/88937597

【MyAndroid】viewpage+cardView卡片叠层效果展示(2)--100个经典UI设计模板(98/100)相关推荐

  1. 【MyAndroid】RecyclerView+cardView卡片叠层效果展示(3)--100个经典UI设计模板(98/100)

    布局: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint. ...

  2. 【MyAndroid】viewpage+cardView卡片海报效果展示--100个经典UI设计模板(99/100)

    官网效果挺好看的: 不过需求不需要指示器 笔者的实现效果如图: PageStyle.NORMAL PageStyle.MULTI_PAGE PageStyle.MULTI_PAGE_OVERLAP 笔 ...

  3. 小程序卡片叠层切换卡片_现在,卡片和清单在哪里?

    小程序卡片叠层切换卡片 重点 (Top highlight) 介绍 (Intro) I was recently tasked to redesign the results of the follo ...

  4. xd可以用ui动效效果吗_通过动画使UI设计栩栩如生:Adobe XD和After Effects

    xd可以用ui动效效果吗 Note - If you don't fancy splashing out on an Adobe license, you can trial their produc ...

  5. 网页ui设计模板素材|液体流动效果!

    如今拟物化设计的热潮褪去,但是在设计UI和网页的时候依然更加深层的表现物理规则.运动特征和质感. 潮流渐变时尚背景抽象化底纹液态AI矢量 潮流渐变时尚背景抽象化底纹液态 物理是一门相当古老的学科,但是 ...

  6. [安卓开发Android][叠层 层叠 卡片效果]RecyclerView与CardView的混合使用

    实现效果 RecyclerView起到一个叠层效果 CardView起到一个阴影效果 一.引入依赖 引入依赖到[bind.gradle]dependencies{}下 implementation ' ...

  7. Android CardView卡片布局详解(八)

    一.CardView简介 CardView卡片布局是Android 5.0之后推出的布局效果,一般用于显示阴影和圆角效果的UI.CardView继承自FrameLayout帧布局,所以它其实还是一个布 ...

  8. 验证码的生成及简单效果展示(Java篇)

    验证码的生成及简单效果展示 前言 一.验证码的生成 1,验证码生成的原理 2,验证码生成步骤 3,代码演示 二.验证码效果演示 1,前端代码展示 2,效果展示 总结 前言 提示:本文设计语言实现Jav ...

  9. ui设计怎样做出有效果的视觉层级?

    作为一名UI设计师,大家应该清楚的了解到每一款产品都有不同的风格和设计,但是每一款UI设计元素都是有通风之处的,如何能够做出有效的视觉层级,对用户的体验有着十分积极的影响.本期UI设计培训教程就为大家 ...

最新文章

  1. 指纹图谱相似度评价软件_远志与炆远志指纹图谱比较
  2. 学写jQuery插件开发方法
  3. 简单工厂模式--加减乘除运算
  4. MySQL Timeout解析
  5. jQuery中添加/改变/移除改变CSS样式例子
  6. 【硬件解码系列】之ffmpeg硬件加速器
  7. c语言so文件反编译,apk so文件反编译教程
  8. linux c语言round函数,c语言round函数使用问题
  9. js对加法计算、减法计算、乘法计算、除法计算的精度处理
  10. python 残差图_python 残差
  11. 面向资源受限安全芯片的开放式运行环境设计
  12. java 批量读取excel表格内容_java 使用POI批量导入excel数据
  13. 烧录esp32 并用oled显示
  14. 城市轨道交通站应急照明疏散指示系统设计
  15. 2014年终总结-暖冬
  16. 云原生数据库整体架构和典型示例
  17. html自动跳转手机,手机浏览网站自动跳转到wap页面的代码
  18. Swoft 踩坑笔记一 - 安装Swoft并启动
  19. 使用oyente智能检测工具总结
  20. stm32上电不能复位

热门文章

  1. 通过TreeMap 和 冒泡算法对JSON 进行排序
  2. 1. Python的基本数据类型-字符串
  3. 【已解决】win10系统使用耳机时左右音量不同
  4. 讲一讲MOS芯片的发热、温升、热阻等概念
  5. 程序员,我心中永恒的痛……
  6. word批量删除中英文间的多个空格
  7. 超外差接收机——射频、中频、基带和镜频干扰
  8. 获取电信光猫超级用户密码
  9. tar 命令高频使用方式+详解
  10. snap7使用说明中文版_驱魔使徒中文版 | 电脑游戏