Banner竖向轮播实现
前言
除了常用横向轮播广告条,现在也有不少应用比如支付宝、美团外卖等首页会有竖向的轮播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竖向轮播实现相关推荐
- android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...
Android自动播放Banner图片轮播效果 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id="@+id/banner" andro ...
- android github轮播图,GitHub - ZTJzzz/Banner: Android轮播图
Android轮播图 - Banner 纵观Android古今,轮播图已然泛滥成灾!大神们各显神通大兴土木,所起楼台之高让后来者心生膜拜,纷纷Star!但不法分子也是层出不穷,为求"大神&q ...
- 响应式banner图片轮播布局代码
响应式banner图片轮播布局代码 基于jQuery制作企业家具网站首页banner响应式图片轮播,支持带左右按钮控制图片淡出淡现切换效果.手机自适应屏幕大小.修改:添加json动态数据轮播图片. 演 ...
- Android三方框架banner实现轮播图
Android三方框架banner实现轮播图 关于 效果图 第一步,添加引用 第二步,新增实体类及测试数据 第三步,添加banner实例控件,修改主界面代码 自定义图片+标题轮播图 效果图 你以为到这 ...
- Kotlin实现Banner广告轮播功能
效果图: 实现方法: 1.在build中添加引用 (1).在头部添加 apply plugin: 'kotlin-kapt' (2).在dependencies中添加 // ...
- android 自动播放 幻灯片,Android自动播放Banner图片轮播效果
本文实例为大家分享了Android自动播放Banner图片轮播的具体代码,供大家参考,具体内容如下 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id=&qu ...
- Axure教程-Banner图片轮播(二)-热区与条件判断
在<Axure教程 Banner图片轮播(一)>基础上增加图片切换按钮. 效果: 轮播2 元件:动态面板和热区 步骤: 1,继续添加动态面反,设置如下: 2,在state1中添加添加三个& ...
- 自定义组合控件:Banner、轮播图、广告栏控件
1. 项目概述 这里,我们使用自定义组合控件实现一个自动轮播的广告条,也叫轮播图,完整版的效果图如下图所示.其实,这就是我们经常见到的滚动广告,默认情况下每隔N 秒会自动滚动,用手指左右滑动时也会切换 ...
- Banner(轮播)
package com.bwei.yangliu20180924.ui;import android.content.Context; import android.widget.ImageView; ...
最新文章
- 《压缩感知回顾与展望》读书笔记
- 还在用Synchronized?Atomic你了解不?
- Eclipse生成JavaDoc时指定字符集, 避免页面乱码
- python生成序列数(1-10)的立方列表_Python 4.3 创建数值列表(动手试一试)
- python的ai写作_神奇,用Python写一个AI贪吃蛇,真的可以追着你跑的那种
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (19) - 系统代理
- java排序方法调用_Java实现顺序查找、二分查找、冒泡排序、方法调用
- linux文件名乱码删除,linux下删除文件名乱码文件
- Dart判断字符串是否为空
- AcWing 兔子与兔子
- 【软路由安装(PVE+ikuai)】
- 用matlab拟合多元函,使用matlab进行多元非线性拟合的方法
- 庄帅:托管分销与物流集成战略雏形
- 菱形图案c语言程序,C语言程序设计,做一个菱形图案
- lisp画弯箭头_在CAD中直接用命令画箭头
- linux查找grep过滤错误信息,Linux 输出过滤器:grep 命令
- June's English
- 三星s9打电话显示无法连接到服务器,三星手机不能拨打电话解决办法
- Note for iSON
- 【详细】MySQL的卸载与安装(图文教程)
热门文章
- 北京市昌平区回龙观个人房屋出租税收代征点介绍
- matlab imfill函数
- ethtool 开启网卡_Linux下使用ethtool满速网卡速率
- 东华大学计算机研究生上岸经验(已上岸)
- 无线专题 openwrt feeds、web框架luci(lua语言)、UCI (统一配置接口)
- BGI-College生信入门——8、R语言基础(一)
- numba 报错 SystemError: initialization of _internal failed without raising an exception
- INF文件是什么(转)
- AndroidStudio音乐播放服务service实现
- cherrytree安装出现see the logfile for detaile错误的处理