热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidViewFlipper的简单使用

这篇文章主要为大家详细介绍了AndroidViewFlipper的简单使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

大家都使用过ViewPager,但是ViewPager还有一个兄弟,那就是ViewFlipper。两者的名字非常相似,我们可以将ViewPager理解成“一页一页的视图”,ViewFlipper则是“快速翻转的视图”,但后者的使用率却远不及前者,不过这并不意味着ViewFlipper就弱了。现在我们就来拜访一下经常被冷落的ViewFlipper。

1、创建工程及页面视图布局

在Android Studio中新建一个工程,实现这样一个效果:创建红、橙、绿、蓝四种颜色的页面,然后通过ViewFlipper让它们来回切换。四个页面布局文件的名称如下所示:

item_view1.xml的代码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


另外三个布局的代码只要把背景色换掉就可以了。

2、添加布局至ViewFlipper

页面创建好了,那我们怎么把它放置到ViewFlipper中呢?很简单,ViewFlipper支持include标签添加页面,我们只需在activity_main.xml中将四个布局依次include进去即可。

直接运行就可以看到下面的效果了:

除了直接在布局文件中添加页面外,也可以在代码中添加,把activity_mai.xml中include标签注释掉,然后在MainActivity中初始化ViewFlipper之后再添加如下的代码:

 //要添加的页面布局ID
 private int viewIds[] = {R.layout.item_view1, R.layout.item_view2, R.layout.item_view3, R.layout.item_view4};
 /**
 * 将页面添加进ViewFlipper
 */
 private void addViews() {
 View itemView;
 for (int viewId : viewIds) {
  itemView = View.inflate(this,viewId,null);
  viewFlipper.addView(itemView);
 }
 }

然后在onCreate中调用addViews方法即可。

3、添加页面切换动画

页面切换的效果我们是实现了,但是没有变化过程,看起来太生硬了,累眼睛。如果能有动画效果的话就会舒服很多。这里,我们就要用到两个新属性了:
- inAnimation:视图进入时的动画效果
- outAnimation:视图退出时的动画效果
这两个属性也可以在代码中设置的,稍后我们会用到。现在,我们就创建所需要的动画文件。比如,我想要实现左右循环滑动的动画效果,那么就可以分成两种情况来讨论:一种是新的视图从左边进入,原有的视图从右边退出,即从左往右滑动;另一种是新视图从右边进入,原有的视图从左边退出,即从右往左滑动。弄清楚所有的动画效果之后,我们就在res文件夹下新建一个anim文件夹,创建如下如下四种动画效果:

left_in.xml

视图从左边进入界面的动画:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 


left_out.xml

视图从左边退出界面的动画:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

right_in.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

right_out.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

现在我们先来试试从左往右转的动画效果。在布局中给ViewFlipper加上如下的属性:

android:inAnimation="@anim/left_in"
android:outAnimation="@anim/right_out"

运行一下,就可以实现从左往右滑动的动画效果了(GIF图有点失真,不过效果是没问题的)。

相信不用我说,你也知道怎么让它从右往左滑动了吧?

4、手指左右滑屏一(使用触摸监听事件实现)

看着画面自顾自地滑动,是不是心痒痒的?没关系,下面我们就来让它响应我们手指的滑动。在此之前,先做点准备工作:前往布局文件,去掉动画属性,并将autoStart属性设为false。

要让它听从“指挥”,我们可以先继承OnTouchListener接口,然后实现onTouch方法:

 private float startX; //手指按下时的x坐标
 private float endX; //手指抬起时的x坐标
 private float moveX = 100f; //判断是否切换页面的标准值
 /**
 * 触摸监听事件
 * @param v
 * @param event
 * @return
 */
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
  //手指按下时获取起始点坐标
  startX = event.getX();
  break;
  case MotionEvent.ACTION_UP:
  //手指抬起时获取结束点坐标
  endX = event.getX();
  //比较startX和endX,判断手指的滑动方向
  if (endX - startX > moveX) { //手指从左向右滑动
   viewFlipper.setInAnimation(this, R.anim.left_in);
   viewFlipper.setOutAnimation(this, R.anim.right_out);
   viewFlipper.showPrevious();
  } else if (startX - endX > moveX) { //手指向右向左滑动
   viewFlipper.setInAnimation(this, R.anim.right_in);
   viewFlipper.setOutAnimation(this, R.anim.left_out);
   viewFlipper.showNext();
  }
  break;
 }
 return true;
 }

上面的代码不难,注释也写得比较清楚了。总体的思路就是获取手指按下和抬起时的坐标,然后判断是向左还是向右滑动。值得注意的是showPrevious和showNext方法,前者是显示上一个视图,后者则是显示后一个视图。最后还要记住,返回值要改为true,否则触摸事件是无法响应的。

效果图如下,可以向左,也可以向右。

5、手指左右滑屏二(使用手势监听事件实现)

除了触摸监听事件之外,我们也可以用手势监听事件OnGestureListener实现同样的效果,但继承了该接口之后要实现一连串的方法,代码一下子膨胀起来了,而我们需要的只是其中一个方法啊。好在Android还提供了一个类SimpleOnGestureListener,这样我们只要自定义一个类继承它,然后实现我们需要的方法就可以了:

 //创建手势监听器
 GestureDetector gestureDetector = new GestureDetector(this, new MyGestureListener());

 /**
 * 自定义手势监听类
 */
 class MyGestureListener extends GestureDetector.SimpleOnGestureListener{
 @Override
 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
  if (e2.getX() - e1.getX() > moveX){
  viewFlipper.setInAnimation(MainActivity.this, R.anim.left_in);
  viewFlipper.setOutAnimation(MainActivity.this, R.anim.right_out);
  viewFlipper.showPrevious();
  } else if (e2.getX() - e1.getX() 

这里的onFling方法得解释一下,它表示的是手指在屏幕上移动然后松开的手势,也就是滑动。前面两个参数分别表示手指按下和松开时的事件,通过它们的对象去调用getX()方法就可以获取滑动前后的坐标了。后面的步骤就跟我们在触摸事件里面的一样,相信你能理解的。

我一开始以为到这里就大功告成了,可运行之后却纹丝不动!仔细查看文档,发现还必须到触摸监听方法中调用onTouchEvent方法才行,否则触摸事件不会起作用的。

 @Override
 public boolean onTouch(View v, MotionEvent event) {
 gestureDetector.onTouchEvent(event);
 return true;
 }

6、后记

ViewFlipper的用法就告一段落了,写这篇文章的时候我还顺便复习了手势监听事件等知识,也希望你能有所收获。下面是源码:
ViewFlipperDemo

7、参考文章

谷歌官方文档之ViewFlipper
Android的手势操作识别

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • MyBatis模糊查询和多条件查询一、ISmbmsUserDao层根据姓名模糊查询publicListgetUser();多条件查询publicList ... [详细]
  • Android的四种启动模式
     对Android的启动模式不是很了解,这里记录下简单的理解内容以便日后查看。 Androi的四种启动模式分别为:standard,singleTop,singleTask,sing ... [详细]
  • 一、使用ContentProvider(内容提供者)共享数据ContentProvider在android中的作用是对外共享数据,也就是说 ... [详细]
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • apk简单介绍APK的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程 ... [详细]
  • 转自:http:malideveloper.arm.comcndevelop-for-malisample-codeetcv1-texture-compression-and-alpha- ... [详细]
  • wsimport“ ... [详细]
  • Java发布webservice应用并发送SOAP请求调用
    webservice框架有很多,比如axis、axis2、cxf、xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ... [详细]
  • Flex中使用filter过滤数据 ... [详细]
  • intellij idea修改maven配置时总是恢复默认配置的解决方法idea版本(2020.2.x)_java
    这篇文章主要介绍了intellijidea修改maven配置时总是恢复默认配置的解决方法idea版本(2020.2.x),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考 ... [详细]
  • 大数据分析Python有哪些爬虫框架
    一、ScrapyScrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。。用 ... [详细]
  • nvmw安装,用于控制node版本;
    之前一直使用的是nodev2.2.0版本,挺说新版本的node解决了npm安装插件产生文件夹结构过深的问题,所以就想更新试试;上网一看才发现,尼玛的node已经到了6.+版本了,好 ... [详细]
  • hibernate映射组件映射
    在Hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid(对象标识符),compo ... [详细]
  • 在ROS系统中,参数读写一般通过xml或者yaml格式的文件,其中yaml用得比较多。这是一种可读性高,轻量级的标记语言,简单好用。对于yaml文件,ros中用的较早版本的yaml- ... [详细]
  • 如何理解MyBatis动态SQL
    本篇内容主要讲解“如何理解MyBatis动态SQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解M ... [详细]
author-avatar
上善若水0716812
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有