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

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

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

item_view1.xml的代码如下:

android:orientation="vertical"

android:background="@android:color/holo_red_light"

android:layout_width="match_parent"

android:layout_height="match_parent">

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

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

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

android:duration="500"

android:fromXDelta="-100%p"

android:toXDelta="0"/>

left_out.xml

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

android:duration="500"

android:fromXDelta="0"

android:toXDelta="-100%p"/>

right_in.xml

android:duration="500"

android:fromXDelta="100%p"

android:toXDelta="0"/>

right_out.xml

android:duration="500"

android:fromXDelta="0"

android:toXDelta="100%p"/>

现在我们先来试试从左往右转的动画效果。在布局中给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() < moveX){

viewFlipper.setInAnimation(MainActivity.this, R.anim.right_in);

viewFlipper.setOutAnimation(MainActivity.this, R.anim.left_out);

viewFlipper.showNext();

}

return true;

}

}

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

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

@Override

public boolean onTouch(View v, MotionEvent event) {

gestureDetector.onTouchEvent(event);

return true;

}

6、后记

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

ViewFlipperDemo

7、参考文章

android view flipper,Android之ViewFlipper的简单使用相关推荐

  1. android view flipper,安卓控件——ViewFlipper

    今天在逛博客的时候又学习到一个新控件,就是ViewFlipper,老规矩,还是通过一个demo来学习,下面先附上效果图: ViewFlipper效果图 根据效果图,说下利用该控件实现的几个简单功能点: ...

  2. android view flipper,2.5.6 ViewFlipper(翻转视图)的基本使用

    本节引言: 本节给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是 ...

  3. Android view.settran,Android RecyclerView从入门到玩坏

    目录 前言 基础使用 分隔线 点击监听 搭配CardView 更丰富的条目 增删条目 快速添加视图 让RecyclerView支持复杂视图 最后前言 RecyclerView在Android界面开发当 ...

  4. android view嵌套,Android RecyclerView嵌套RecyclerView点击事件

    RecyclerView嵌套RecyclerView点击事件遇到取值错乱的问题 其实问题根本就是咱们没有处理好被嵌套的那层recycleview的position 那么解决思路也很简单,想办法把被嵌套 ...

  5. android.view.surface,Android SurfaceView 源码分析及使用

    概述 SurfaceView 是 Android 中一种比较特殊的视图(View),它跟平时时候的 TextView.Button 最大的区别是它跟它的视图容器并不是在同一个视图层上,它的 UI 显示 ...

  6. android view禁用,Android 禁止ViewPager的自带滑动效果

    由于最近在做墨水屏的相关工作,ViewPager自带的滑动效果在墨水屏上表现的很不好,残影太重了.所以禁止自带的滑动效果,用接口来接管相关逻辑实现自处理. import android.content ...

  7. Android view变形,android仿变形金刚效果实现MatchView

    what?变形金刚!先看效果吧! MainActivity.javapackage com.lee.matchview; import com.example.matchview.R; import ...

  8. android view setleft,android – 在新textview上使用setLeft / setRight方法

    我正在以编程方式使用TextViews,我需要动态添加新视图并在RelativeLayout父级中设置它们的左/顶位置. 我正在做的是这样的: RelativeLayout global=(Relat ...

  9. android view 平滑,Android移动view动画问题(让移动更平滑)

    Android写动画效果不是一般的麻烦,网上找了好久,终于解决了动画的问题,总结记录以共勉. 仅以水平方向移动效果做说明,垂直方向类似. 完整动画函数代码: public void slideview ...

最新文章

  1. ubuntu14 安装JDK
  2. 学习AOP 之前必须明白的几个概念
  3. block size in download header
  4. “访问 IIS 元数据库失败”的错误信息
  5. php插入方法,有什么办法能把一条php语句插入到方法里呢?
  6. 白云区五措施扶持服务外包及呼叫中心产业发展
  7. 原 oracle执行update一直处于执行中,跟卡住一样
  8. Android 7.1 App Shortcuts使用
  9. mit的java教材_关于学习MIT6.828操作系统课程lab1记录
  10. android4.2.2+手机管家,深度清理手机垃圾 腾讯手机管家V4.2评测
  11. Rancher Cluster is being upgraded
  12. java区间并集_区间并集求解算法实现
  13. 数据分析tableau 和 python的区别_数据分析师综述篇
  14. python提取excel一列或多列数据另存为新表(1)
  15. Linux高并发服务器开发---笔记2(多进程)
  16. 破解 WiFi,获取 WiFi 密码
  17. 电子元器件品牌及其代理商
  18. 笔试总结——0310华为软笔C++
  19. Aegisub设置字体透明度
  20. IQA (图像质量评价)

热门文章

  1. java poi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)
  2. AI伪原创神器,AI文案生成器!
  3. 【React】946- 一文吃透 React Hooks 原理
  4. 7.Java_模板设计模式---抽象类的实际应用(咖啡和茶的冲泡法),基于抽象类,核心是封装算法。引入钩子方法。开闭原则。23种设计模式
  5. 国产EDA如何突围?
  6. 韩寒很狡猾,刘谦很无辜
  7. 2023 即将来临,可能移动开发的大环境比 2022 还要差。
  8. 配置IIS之虚拟目录
  9. 解开Vista谜团 你真的需要Vista吗?
  10. 采用QT进行OpenGL开发(二)绘制立方体