ViewFlipper实现带索引效果的自动播放也可手动滑动的广告栏
前几天看到淘宝和易迅的客户端的广告栏做的不错,今天就尝试了一下,模仿着写了带指引的ViewFlipper。本文主要介绍指引栏的实现,论坛上关于ViewFlipper的使用和介绍很多,就不过多介绍。
效果图如下:
首先是布局,稍有Android开发经验的人很容易看出来,这是一个Layout里面嵌套了ViewFliper和一个LinearLayout。布局如下:
- <RelativeLayout
- android:id="@+id/food_recom_viewfliper_rl"
- android:layout_width="fill_parent"
- android:longClickable="true"
- android:layout_height="150dp">
- <com.mobsut.mm.widget.GestureViewFliper
- android:id="@+id/food_recom_viewfliper"
- android:layout_height="150dp"
- android:background="@color/white"
- android:layout_width="fill_parent"/>
- <LinearLayout
- android:id="@+id/food_recom_page_indicator"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:gravity="center"
- android:orientation="horizontal"
- android:padding="@dimen/offset_2dp"></LinearLayout>
- </RelativeLayout >
可以看到这个GestureViewFliper是我自定义的,继承于VIewFlipper,实现OnGestureListener接口用来识别用户手势,让用户可以手动滑动广告栏。在用GestureDetector 识别手势时,会出现一个问题:onFling函数不被触发,这时需要把onDown设置为true。
在用户滑动之前,需要注意:当用户将作出滑动手势时,需要停掉自动播放,然后用户结束滑动时,继续自动播放。
然后是重点,要实现带索引的效果,首先需要得到ViewFlipper的当前展示的View的索引值,而这个View当自动播放时是实时变化的,但是ViewFlipper并没有提供一个接口,在可以监听自动播放时view的变化。所以,需要自定义一个回调接口,监听displayView的变化,并把相应的索引值传递出去。这样才可以实现索引效果。
自定义的ViewFlipper源码如下:
- package com.mobsut.mm.widget;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.GestureDetector;
- import android.view.View;
- import android.view.GestureDetector.OnGestureListener;
- import android.view.MotionEvent;
- import android.view.animation.AnimationUtils;
- import android.widget.ViewFlipper;
- /*
- * 自定义的ViewFliper,监听滑动手势,以及自动指引
- * @author jiakang
- */
- import com.mobsut.mm.R;
- public class GestureViewFliper extends ViewFlipper implements OnGestureListener {
- GestureDetector gestureDetector = null;
- private Context mContext = null;
- FlipperFacousChangedListener flipperFacousChangedListener=null;
- public GestureViewFliper(Context mContext) {
- super(mContext);
- }
- public GestureViewFliper(Context mContext, AttributeSet attrs) {
- super(mContext, attrs);
- this.mContext = mContext;
- gestureDetector = new GestureDetector(mContext, this);
- setLongClickable(true);
- setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // TODO Auto-generated method stub
- return gestureDetector.onTouchEvent(event);
- }
- });
- }
- @Override
- public void startFlipping() {
- // TODO Auto-generated method stub
- super.startFlipping();
- setInAnimation(AnimationUtils.loadAnimation(mContext,
- R.anim.m_push_up_in));
- setOutAnimation(AnimationUtils.loadAnimation(mContext,
- R.anim.m_push_up_out));
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // TODO Auto-generated method stub
- stopFlipping(); //用户点击屏幕时,停止滑动
- setAutoStart(false); //取消自动滑动
- return this.gestureDetector.onTouchEvent(event); //把touch事件交给gesture处理
- }
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- <span style="color:#ff0000;">return true;</span> // 缺省值是false,在onTouchEvent后触发,如果为false,onFling将得不到down的事件即不触发
- }
- /*
- * 重写了onFling,为了判断手势,让手势滑动
- *
- * @see android.view.GestureDetector.OnGestureListener#onFling(android.view.
- * MotionEvent, android.view.MotionEvent, float, float)
- */
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- // TODO Auto-generated method stub
- if (e2.getX() - e1.getX() > 120) { // 从左侧滑进
- setInAnimation(AnimationUtils.loadAnimation(mContext,
- R.anim.m_push_up_in)); //设置进出动画
- setOutAnimation(AnimationUtils.loadAnimation(mContext,
- R.anim.m_push_up_out));
- //用户手势滑动结束,再次开始自动播放
- showPrevious();
- setAutoStart(true);
- startFlipping();
- return true;
- } else if (e2.getX() - e1.getX() < -120) { //从右侧画出
- setOutAnimation(AnimationUtils.loadAnimation(mContext,
- R.anim.m_push_up_out)); //设置进出动画
- setInAnimation(AnimationUtils.loadAnimation(mContext,
- R.anim.m_push_up_in));
- //滑动结束,再次自动播放
- showNext();
- setAutoStart(true);
- startFlipping();
- return true;
- }
- return false;
- }
- @Override
- public void showNext() {
- // TODO Auto-generated method stub
- super.showNext();
- //监听向下向下翻页
- <span style="color:#ff0000;">flipperFacousChangedListener.onFliperChanged(getDisplayedChild());</span>
- }
- @Override
- public void showPrevious() {
- // TODO Auto-generated method stub
- super.showPrevious();
- //监听向上翻页
- <span style="color:#ff0000;">flipperFacousChangedListener.onFliperChanged(getDisplayedChild());</span>
- }
- @Override
- public void onLongPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- // TODO Auto-generated method stub
- return true;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- /*
- * 回调接口,用于监听viewflipper切花事件
- */
- public interface FlipperFacousChangedListener{
- public void onFliperChanged(int index);
- }
- public void setOnFacousChangedListener(FlipperFacousChangedListener flipperFacousChangedListener){
- this.flipperFacousChangedListener=flipperFacousChangedListener;
- }
- }
接着是实现部分,指引条是由两张图片构成,选中项目一个颜色,未选中时一个颜色。实现比较简单,部分代码如下:
- package com.mobsut.mm.foods;
- public class FoodRecomFragment extends Fragment {
- private Context mContext=null;
- private LinearLayout mainLayout=null;
- private LinearLayout indicatorLayout=null;
- private ImageView[] mImageView;
- private int[] fliperImage={R.drawable.fliper1,R.drawable.fliper2,R.drawable.fliper3};
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- mContext=getActivity();
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- mainLayout=(LinearLayout)inflater.inflate(R.layout.food_recom_fragment_main,container,false);
- indicatorLayout=(LinearLayout)mainLayout.findViewById(R.id.food_recom_page_indicator);
- GestureViewFliper viewFilper=(GestureViewFliper)mainLayout.findViewById(R.id.food_recom_viewfliper);
- mImageView=new ImageView[fliperImage.length];
- for(int i=0;i<fliperImage.length;i++){
- ImageView iv=new ImageView(mContext);
- ImageView indicatorView=new ImageView(mContext);
- if(i==0){
- indicatorView.setImageResource(R.drawable.page_selected);//初始默认选中第一张为当前指引
- }else{
- indicatorView.setImageResource(R.drawable.page_normal);
- }
- iv.setImageResource(fliperImage[i]);
- //把指引条的图片添加到LinearLayout里面
- LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
- lp.setMargins(6, 0, 0, 0);
- indicatorView.setLayoutParams(lp);
- iv.setScaleType(ScaleType.FIT_XY);
- viewFilper.addView(iv, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
- mImageView[i]=indicatorView;
- indicatorLayout.addView(mImageView[i]);
- }
- viewFilper.setAutoStart(true); //让viewFlipper自动播放
- viewFilper.setFlipInterval(4000); //间隔为4S
- if(viewFilper.isAutoStart()&&viewFilper.isFlipping()){
- viewFilper.startFlipping();
- }
- if(viewFilper.getDisplayedChild()!=0){
- viewFilper.setInAnimation(AnimationUtils.loadAnimation(
- mContext, R.anim.m_push_up_in)); //进出动画
- viewFilper.setOutAnimation(AnimationUtils.loadAnimation(
- mContext, R.anim.m_push_up_out));
- }
- viewFilper.setOnFacousChangedListener(new FlipperFacousChangedListener() {
- @Override //实现监听接口
- public void onFliperChanged(int index) {
- // TODO Auto-generated method stub
- for(int i=0;i<mImageView.length;i++){
- if(i==index){
- mImageView[i].setImageResource(R.drawable.page_selected);
- }else{
- mImageView[i].setImageResource(R.drawable.page_normal);
- }
- }
- }
- });
- return mainLayout;
- }
- }
ViewFlipper实现带索引效果的自动播放也可手动滑动的广告栏相关推荐
- 自定义ViewFlipper实现带索引效果的自动播放广告栏
前几天看到淘宝和易迅的客户端的广告栏做的不错,今天就尝试了一下,模仿着写了带指引的ViewFlipper.本文主要介绍指引栏的实现,论坛上关于ViewFlipper的使用和介绍很多,就不过多介绍. 效 ...
- 用jQuery实现轮播图效果(自动播放,能手动切换)
大家好,今天我和大家分享一下轮播图的实现,下面是我做的轮播图效果 首先我们看到,它是由背景图片.方向图标和指示器组成.**我们发现背景图片.方向图标和指示器是层叠在一起的,所以布局时我们要用绝对定位. ...
- android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...
Android自动播放Banner图片轮播效果 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id="@+id/banner" andro ...
- android 滑动自动播放,Android仿新浪微博滑动播放视频
最近突发奇想,想实现下 类似新浪微博 或者 qq空间,播放视频,所以就在git上边找了一下,若有侵权,请及时联系我,立马删除,谢谢 本文仿照新浪微博/QQ空间实现了滑动自动播放视频的功能.
- 网页中视频内容自动播放
目前主流的浏览器中已经禁止带声音的媒体自动播放.具体内容在这里chrome自动播放策略(可能国内网络访问不了).此处重点是带声音的媒体自动播放. 里面也说明了集中播放的方式 静音播放.只要将video ...
- html背景音乐自动播放embed,怎样在网页中插入背景音乐(自动播放代码).doc
怎样在网页中插入背景音乐 软件 Dreamweaver带浏览器的电脑 1 首先在网上下载一个Dreamweaver软件安装,当然使用其他的网站编程软件也可以. 2 打开软件界面如下. 3 选择&quo ...
- Firefox 66 将阻止自动播放音频和视频
百度智能云 云生态狂欢季 热门云产品1折起>>> 当我们点击一个链接,或者打开新的浏览器选项卡时,浏览器就开始自动播放视频和声音,这是一件十分烦人的事.Chrome 浏览器早已对 ...
- audio音频不能自动播放的解决方法
由于浏览器限制的原因,不允许自动播放audio音频,尝试网上的方法后也没有进展(如果有解决方法,欢迎评论~) 一.首先创建 audio 标签 <audio class="g-back- ...
- ppt手动放映怎么设置_为什么ppt已经设置了手动放映还是自动播放呢
在切换选项那里看看是不是选上了按时间切换,另外录制排练那里也不要选上. 本回答被网友采纳 你要把定时切换的那个地方的对勾取消. 原因:在勾选"点击播放"的同时也点击设置了自动播放时 ...
最新文章
- CSS漂亮盒子(上)
- php html标签自定义属性,详解H5的自定义属性data-*
- laravel5.4根据数据表生成迁移文件
- Centos7等保三级检查命令
- 【mybatis】学习笔记之conf.xml与mapper.xml配置
- 【转】webservice 测试地址
- new函数的使用方法
- excel使用教程_如何系统地学习Excel?
- 用BeautifulSoup爬取豆瓣妹子的图片
- Powershell添加英文输入法
- 2020版熊猫金币解读及购买方式
- 官方活动|最高可免费领60天会员时长
- 男人还是学点一技之长最靠谱
- 八百元八核的服务器?二手服务器(工作站)搭建指南(下)
- BAT大厂面试题以及答案(一)
- MDK中自动添加程序编译日期版本
- 存储格式在Hive的应用
- kaggle竞赛 | 计算机视觉 | Doodle Recognition Challenge
- sql server2008处理笛卡儿积的逻辑——记一次解决疑惑
- Pygame 官方文档 - pygame.mouse
热门文章
- 杰奇小说系统百度地图生成插件
- 关于NC6.X企业报表取不了数的问题及其解决方法。
- 用网络求t图的几篇论文框架图
- 爱征信,就是爱自己 | 个人征信怎么查?攻略在这里!
- python输入复数_如何在Python中作为用户输入获取复数?
- Learn English with M / 学习英语的十句经典名言
- TFTP协议解析及C/C++代码实现
- 几万年前,孙悟空大闹地府后删库跑路了!那阎王生死簿又该怎么写呢?
- 计算几何入门 1.3:凸包的构造——增量构造法
- PHP字符串函数strlen(获取字符串长度)