如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456

某天看到京东商城首页的滑动广告的Banner,在流动切换的时候有立体的动画效果,感觉很有意思,然后研究了下如何实现.

废话不多说,接下来我会讲述如何实现这种效果,以及如何根据需求自定义出新的动画效果进行扩展实现.

首先还是看一下京东商城上的效果:

像一般做这种效果怎么办呢?我的建议还是先在github或者google code上搜索开源库. 一来开源库一般做得比较成熟,API封装得较好,耦合性比较低. 二来项目比较利于维护.

(并不是说全自己实现的就不好,毕竟每个人实现的思路并不一样,相对于开源库来说,阅读别人的历史代码就相对比较麻烦,有bug或者有新需求的话,会很影响开发的效率)

下面还是直接上项目, 如上所示的效果已经有开源库的实现,而且还有很多其他动画补间效果:

JazzViewPager简介:

github地址: https://github.com/jfeinstein10/JazzyViewPager

该项目是基于ViewPager的一个重写,让我们看一下自带的Demo项目结构:

这里我们可以看到,ViewPager的动画效果由nineoldandroids这个开源项目实现:

github地址:

https://github.com/JakeWharton/NineOldAndroids

该动画库将Android3.0以上版本API实现的动画做了重写,可以兼容到3.0以下的版本

JazzyViewPager的集成:

接下来我们看一下如何将该开源库集成到自己的项目中:

1.布局文件中遵照自定义控件的写法即可:

<com.jfeinstein.jazzyviewpager.JazzyViewPagerxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/jazzy_pager"android:layout_width="match_parent"android:layout_height="match_parent" />


2.设置ViewPager的动画效果:

这里首先介绍一下目前已经封装好的效果:

JazzyViewPager中的的枚举类:

public enum TransitionEffect {Standard,Tablet,CubeIn,CubeOut,FlipVertical,FlipHorizontal,Stack,ZoomIn,ZoomOut,RotateUp,RotateDown,Accordion}

怎么设置呢?非常简单:

private JazzyViewPager mJazzy;
/* ... */
mJazzy.setTransitionEffect(TransitionEffect.*);

在京东商城使用的效果即为TransitionEffect.CubeOut

这里我们还可以看一下其他的效果

TransitionEffect.Tablet

 

TransitionEffect.Stack

其他效果大家可以自己尝试下.

3.集成该开源库需要注意一些事项:

当ViewPager中的子View超过三个的时候,我们需要对PagerAdapter修改,重写InstantiateItem()方法,如下:

private JazzyViewPager mJazzy;
/* ... */
@Override
public Object instantiateItem(ViewGroup container, final int position) {Object obj = super.instantiateItem(container, position);mJazzy.setObjectForPosition(obj, position);return obj;
}

JazzyViewPager的修改:

如果大家还是嫌目前已经封装的效果还是不满意怎么办?项目有其他动画实现的需求怎么办?这里顺便讲下如何扩展该开源库:(红色部分为需要添加修改的代码)

1.在枚举类中添加所需的动画效果,这里以Test代替.

public enum TransitionEffect {Standard,Tablet,CubeIn,CubeOut,FlipVertical,FlipHorizontal,Stack,ZoomIn,ZoomOut,RotateUp,RotateDown,Accordion,Test}

2.增加动画效果的具体实现:

protected void animateTest(View left, View right, float positionOffset) {  if (mState != State.IDLE) {if (left != null) {//此处增加具体动画}if (right != null) {//此处增加具体动画实现 }}
}

3.在onPageScrolled的方法中,增加对应效果的处理:

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {if (mState == State.IDLE && positionOffset > 0) {oldPage = getCurrentItem();mState = position == oldPage ? State.GOING_RIGHT : State.GOING_LEFT;
}
boolean goingRight = position == oldPage;
if (mState == State.GOING_RIGHT && !goingRight)mState = State.GOING_LEFT;else if (mState == State.GOING_LEFT && goingRight)mState = State.GOING_RIGHT;float effectOffset = isSmall(positionOffset) ? 0 : positionOffset;// mLeft = getChildAt(position);// mRight = getChildAt(position+1);mLeft = findViewFromObject(position);mRight = findViewFromObject(position+1);if (mFadeEnabled)animateFade(mLeft, mRight, effectOffset);if (mOutlineEnabled)animateOutline(mLeft, mRight);switch (mEffect) {case Standard:break;case Tablet:animateTablet(mLeft, mRight, effectOffset);break;case CubeIn:animateCube(mLeft, mRight, effectOffset, true);break;case CubeOut:animateCube(mLeft, mRight, effectOffset, false);break;case FlipVertical:animateFlipVertical(mLeft, mRight, positionOffset, positionOffsetPixels);break;case FlipHorizontal:animateFlipHorizontal(mLeft, mRight, effectOffset, positionOffsetPixels);case Stack:animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);break;case ZoomIn:animateZoom(mLeft, mRight, effectOffset, true);break;case ZoomOut:animateZoom(mLeft, mRight, effectOffset, false);break;case RotateUp:animateRotate(mLeft, mRight, effectOffset, true);break;case RotateDown:animateRotate(mLeft, mRight, effectOffset, false);break;case Accordion:animateAccordion(mLeft, mRight, effectOffset);break;case Test:
  animateTest(mLeft, mRight, effectOffset);break;
 }super.onPageScrolled(position, positionOffset, positionOffsetPixels);if (effectOffset == 0) {
disableHardwareLayer();
mState = State.IDLE;
}}

经过这三步,我们就可以添加具有新的补间动画的ViewPager. 这里大家可以尽情发挥自己的创意,不断地扩展该开源库,实现自己想要的效果.

Demo下载地址:http://download.csdn.net/detail/t12x3456/6468601

转载于:https://www.cnblogs.com/pangblog/p/3395507.html

Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果相关推荐

  1. android高分段进阶攻略(9)——ViewPager补间动画实现京东广告Banner

    最近工作较忙,勿发私信,最近看了一篇不错的博客(http://blog.csdn.net/t12x3456/article/details/13290349),使用第三方插件实现京东广告Banner, ...

  2. 属于android动画的是什么,下列选项中,属于Android系统的补间动画的是( )

    下列选项d系ASK指的是() 属于高压蒸汽灭菌法时各种包裹应小于: 补间良性肿瘤治疗措施应选取: 动画诊断肿瘤最直接可靠的证据是: 下列选项d系受伤半小时为张力性气胸,经胸腔闭式引流,肺不能复张,平静 ...

  3. Android笔记 xml补间动画

    fromAlpha开始透明度 toAlpha结束透明度 fillAfter与fillBefore指定最终是与开始还是结束样式相同 android:pivotY="50%" 相对于自 ...

  4. Android动画总结系列(2)——补间动画使用

    一.综述 补间动画(Tween Animation.View Animation)是Android的基本动画之一,其与帧动画的本质完全不同.帧动画的原理是逐帧播放Drawable形成动画效果,补间动画 ...

  5. 补间动画详解一 基类Animation

    补间动画(Tween animation)是通过在两个关键帧之间补充渐变的动画效果来实现的. Android系统提供了四个补间动画的类,分别是AlphaAnimation.RotateAnimatio ...

  6. Android动画攻略—帧动画、补间动画、属性动画

    前言 动画时Android开发中使用频率比较高的功能. 对Android提供的补间动画,帧动画以及属性动画做出归纳总结. 目录 1. 帧动画 帧动画总体实现比较简单,其实现本身是实现一个图片集的连续播 ...

  7. android 获取动画资源,Android动画资源(二)——补间动画资源

    Android animations.png Android动画资源系列文章:Android动画资源文件总结 Tween animation 用XML定义的动画,在图形上执行诸如旋转.透明度变化.移动 ...

  8. 补间动画 http://www.sunnyos.com/

    版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.360doc.com/content/16/0322/07/31855033_544211806.shtml Tween动画 ...

  9. android104 帧动画,补间动画,属性动画

    ##帧动画FrameAnimation * 多张图片快速切换,形成动画效果 * 帧动画使用xml定义 package com.itheima.frameanimation;import android ...

  10. Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】

    目   录 刮刮卡案例[ScratchCard] 结构图 activity_main.xml MainActivity.java 运行效果图 补间动画(Tween Animation) 逐帧动画(Fr ...

最新文章

  1. tomcat日志切割
  2. linux磁盘空间不足,但是使用df却发现磁盘空间至少有一半的空间没有使用
  3. CSS3自定义滚动条
  4. AD20学习笔记3---PCB封装库的创建方法及现有封装调用
  5. 试着翻译24小时自学SQL第四版
  6. android编程文献,郭宏志. Android应用开发详解[M]. 2011.
  7. 斯坦福2019强化学习课程完结,讲义、PPT、视频已提供下载
  8. python递归函数分叉树枝_python递归函数绘制分形树的方法
  9. x64驱动遍历 DPC 定时器
  10. 戴尔机架式服务器哪个型号好,戴尔_PowerEdge R540_机架式服务器参数_服务器推荐购买 | Dell 中国大陆...
  11. 计算机无法写入U盘,电脑无法拷贝U盘文件怎么办|解除U盘写保护设置的方法
  12. 绝地反击 我的战胜贫困的经历01 转载 整理
  13. python函数详细讲解_小白必看的Python函数讲解
  14. 01[自制油猴插件]去掉烦人的外链提醒
  15. 用最通俗易懂的话告诉你交换机和路由器的区别
  16. 微信小程序圣诞帽_构建圣诞快乐Web应用程序界面
  17. 微博的大数据挖掘:知著、见微、晓意
  18. Windows消息拦截技术的应用(Hook钩子)
  19. Unity3d 微信小程序(小游戏)项目实现流量主接入功能(含源码)
  20. 测试开发——测试分类

热门文章

  1. cocos creator基础-(五)cc.Component使用
  2. 编写可维护的javascript代码--- 2015.11.21(基本格式化)
  3. 关于Python中的classmethod
  4. Spark入门实战系列--6.SparkSQL(下)--Spark实战应用
  5. 常用数据存储格式之xml
  6. MVC公司架构介绍-工具类(一)
  7. The prefix mvc for element mvc:annotation-driven is not bound 的解决方法
  8. 队列的实现(二) 链式队列的实现
  9. nyoj---快速查找素数
  10. Jpeg图像转yuv 16倍数问题(第一季)