前言

除了常用横向轮播广告条,现在也有不少应用比如支付宝、美团外卖等首页会有竖向的轮播Banner。其实横向轮播Banner在一个页面上如果有两个或以上,会让用户觉得很怪,这主要是因为只有横向切换展现方式过于单调。增加了竖向轮播控件,界面上又多了一种吸引用户的表现方式,这对提升用户体验很有帮助。接下来使用两种不同的方式实现竖向轮播。

实现效果

实现接口

在同一个位置有两个视图,这两个视图一个在可见位置向上到用户看不到的位置,另外一个从底部看不到的位置向上运动到用户完全看到的位置。可以用下图来描述整个运动过程:

这样就很容易想到一个属性translationY,可以看到隐藏和展示的两个View都在不停的变换自己的translationY属性值。现在就可以通过属性动画结合postDelay来实现不断的竖向切换效果。

还有另外一种实现就是使用ViewFlipper切换,查看ViewFlipper的源码会发现实现其实是在FrameLayout中把所有的View都加入,然后展示哪个View就先设置可见再执行translate动画,隐藏哪个View就先执行translate动画再隐藏View。

实现过程

TranslationY属性动画

观察上面的动画示意图会发现第一个要隐藏View的translationY是从(0, -view.getHeight()),而第二个要展示的View的translationY是从(view.getHeight(), 0)变化,找到这个规律之后很容易实现竖向的切换效果。

public class VerticalScrollView extends FrameLayout {// 处于隐藏状态的Viewprivate View recycleView;// 处于可见状态的Viewprivate View currentView;// 正常的数据Adapterprivate BaseAdapter adapter;private int current = -1;private Runnable playRunnable = new Runnable() {@Overridepublic void run() {// 每过一段时间切换数据current = (current + 1) % adapter.getCount();// 为隐藏的View更新数据,复用以前用过的ViewView newView = adapter.getView(current, recycleView, VerticalScrollView.this);// 定义隐藏属性动画ObjectAnimator hide = ObjectAnimator.ofFloat(currentView, "translationY", 0, -recycleView.getHeight());// 定义展示属性动画ObjectAnimator show = ObjectAnimator.ofFloat(newView, "translationY", newView.getHeight(), 0);AnimatorSet animatorSet = new AnimatorSet();animatorSet.play(hide).with(show);animatorSet.setDuration(1000);animatorSet.start();// 交换隐藏View和当前View的引用recycleView = currentView;currentView = newView;// 3秒之后再进行一次postDelayed(this, 3000);}};public VerticalScrollView(@NonNull Context context) {this(context, null);}public VerticalScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public VerticalScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {}public void setAdapter(BaseAdapter adapter) {this.adapter = adapter;if (adapter == null || adapter.getCount() < 1) {setVisibility(View.GONE);return;}// 初始化第一次展示的ViewcurrentView = adapter.getView(0, null, this);// 初始化隐藏的ViewrecycleView = adapter.getView(1, null, this);current = 0;addView(recycleView);addView(currentView);}public void pausePlay() {removeCallbacks(playRunnable);}public void resumePlay() {removeCallbacks(playRunnable);postDelayed(playRunnable, 3000);}public void destroy() {pausePlay();playRunnable = null;}
}

通过简单的对postDelay和ObjectAnimator做封装,用户只要调用setAdapter就可以实现竖向轮播的效果。

ViewFlipper实现

ViewFlipper的实现就更简单了,只需要提供展示和隐藏时候的动画效果就可以了。

// slide_in.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fromXDelta="0"android:fromYDelta="100%p"android:toXDelta="0"android:toYDelta="0"></translate>// slide_out.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fromXDelta="0"android:fromYDelta="0"android:toXDelta="0"android:toYDelta="-100%p"></translate>
public class VerticalScrollView2 extends ViewFlipper {private BaseAdapter adapter;public VerticalScrollView2(@NonNull Context context) {this(context, null);}public VerticalScrollView2(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}private void init() {// 初始化ViewFlipper,设置展示进入和隐藏退出的动画效果setAutoStart(false);setFlipInterval(3000);setInAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.slide_in));setOutAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.slide_out));}public void setAdapter(BaseAdapter adapter) {this.adapter = adapter;if (adapter == null || adapter.getCount() < 1) {setVisibility(View.GONE);return;}// 把Adapter中所有的ItemView都生成添加到ViewFlipper中for (int i = 0, count = adapter.getCount(); i < count; i++) {addView(adapter.getView(i, null, this));}}public void pausePlay() {stopFlipping();}public void resumePlay() {startFlipping();}public void destroy() {pausePlay();}
}

查看全部实现代码请点击查看源码

总结

竖向轮播相对比较简单,但是属性动画的实现方式只会生成两个视图布局,一个是展示用,另外一个是隐藏时用,这里借鉴了ListView的复用思想。但是ViewFlipper要求一次把所有的视图都生成,如果数据量很大明显就不合适。所以如果很在乎不要大量产生视图对象,采用属性动画方式更好,如果数据量不大ViewFlipper实现更加简单易用。

Banner竖向轮播实现相关推荐

  1. android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...

    Android自动播放Banner图片轮播效果 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id="@+id/banner" andro ...

  2. android github轮播图,GitHub - ZTJzzz/Banner: Android轮播图

    Android轮播图 - Banner 纵观Android古今,轮播图已然泛滥成灾!大神们各显神通大兴土木,所起楼台之高让后来者心生膜拜,纷纷Star!但不法分子也是层出不穷,为求"大神&q ...

  3. 响应式banner图片轮播布局代码

    响应式banner图片轮播布局代码 基于jQuery制作企业家具网站首页banner响应式图片轮播,支持带左右按钮控制图片淡出淡现切换效果.手机自适应屏幕大小.修改:添加json动态数据轮播图片. 演 ...

  4. Android三方框架banner实现轮播图

    Android三方框架banner实现轮播图 关于 效果图 第一步,添加引用 第二步,新增实体类及测试数据 第三步,添加banner实例控件,修改主界面代码 自定义图片+标题轮播图 效果图 你以为到这 ...

  5. Kotlin实现Banner广告轮播功能

    效果图:               实现方法: 1.在build中添加引用 (1).在头部添加 apply plugin: 'kotlin-kapt' (2).在dependencies中添加 // ...

  6. android 自动播放 幻灯片,Android自动播放Banner图片轮播效果

    本文实例为大家分享了Android自动播放Banner图片轮播的具体代码,供大家参考,具体内容如下 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id=&qu ...

  7. Axure教程-Banner图片轮播(二)-热区与条件判断

    在<Axure教程 Banner图片轮播(一)>基础上增加图片切换按钮. 效果: 轮播2 元件:动态面板和热区 步骤: 1,继续添加动态面反,设置如下: 2,在state1中添加添加三个& ...

  8. 自定义组合控件:Banner、轮播图、广告栏控件

    1. 项目概述 这里,我们使用自定义组合控件实现一个自动轮播的广告条,也叫轮播图,完整版的效果图如下图所示.其实,这就是我们经常见到的滚动广告,默认情况下每隔N 秒会自动滚动,用手指左右滑动时也会切换 ...

  9. Banner(轮播)

    package com.bwei.yangliu20180924.ui;import android.content.Context; import android.widget.ImageView; ...

最新文章

  1. 《压缩感知回顾与展望》读书笔记
  2. 还在用Synchronized?Atomic你了解不?
  3. Eclipse生成JavaDoc时指定字符集, 避免页面乱码
  4. python生成序列数(1-10)的立方列表_Python 4.3 创建数值列表(动手试一试)
  5. python的ai写作_神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (19) - 系统代理
  7. java排序方法调用_Java实现顺序查找、二分查找、冒泡排序、方法调用
  8. linux文件名乱码删除,linux下删除文件名乱码文件
  9. Dart判断字符串是否为空
  10. AcWing 兔子与兔子
  11. 【软路由安装(PVE+ikuai)】
  12. 用matlab拟合多元函,使用matlab进行多元非线性拟合的方法
  13. 庄帅:托管分销与物流集成战略雏形
  14. 菱形图案c语言程序,C语言程序设计,做一个菱形图案
  15. lisp画弯箭头_在CAD中直接用命令画箭头
  16. linux查找grep过滤错误信息,Linux 输出过滤器:grep 命令
  17. June's English
  18. 三星s9打电话显示无法连接到服务器,三星手机不能拨打电话解决办法
  19. Note for iSON
  20. 【详细】MySQL的卸载与安装(图文教程)

热门文章

  1. 北京市昌平区回龙观个人房屋出租税收代征点介绍
  2. matlab imfill函数
  3. ethtool 开启网卡_Linux下使用ethtool满速网卡速率
  4. 东华大学计算机研究生上岸经验(已上岸)
  5. 无线专题 openwrt feeds、web框架luci(lua语言)、UCI (统一配置接口)
  6. BGI-College生信入门——8、R语言基础(一)
  7. numba 报错 SystemError: initialization of _internal failed without raising an exception
  8. INF文件是什么(转)
  9. AndroidStudio音乐播放服务service实现
  10. cherrytree安装出现see the logfile for detaile错误的处理