在Android应用开发中,我们经常会需要实现左右切换视图的功能,这通常需要在LinearLayout、RelativeLayout等布局中添加ImageView来实现。如果每次只需展示一张图片,并可以通过左右滑动屏幕来显示前一张或者后一张图片,就可以通过ViewFlipper或者ViewSwitcher来实现。滑动的手势检测主要通过MotionEvent类来实现,但在本文中是由GestureDetector类来实现的。

当我们需要在两个或更多个视图间滑动显示时,ViewFlipper类通常是最好的选择。使用ViewFlipper需在布局文件中添加相应的ViewFlipper内容:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"> <ViewFlipper
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewFlipper"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
</ViewFlipper> </RelativeLayout>
可以通过两种方式向ViewFlipper中添加子视图:
    > 在布局资源内添加
    > 程序化添加
在下面的示例中采用第二种方式。
接下来在Activity中向ViewFlipper程序化添加图片:
public class MainActivity extends AppCompatActivity {

    private ViewFlipper viewFlipper;
private GestureDetector gestureDetector; int[] resources = {
R.drawable.one,
R.drawable.two,
R.drawable.three,
R.drawable.four,
R.drawable.five,
R.drawable.six
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper); for (int i = 0; i < resources.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(resources[i]);
viewFlipper.addView(imageView);
}
}
}

至此,运行APP可以看到会显示第一张图片,但滑动屏幕并不能显示其他图片。下面,我们用GestureDetector类来检测滑动动作,首先需要自定义一个继承了SimpleOnGestureListener的类,在其中判断滑动方向并显示相应图片:

class CustomGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX() > e2.getX()) { //如果初始触点的X坐标比最终触点的X坐标大表示向左滑动
viewFlipper.showNext();
} if (e1.getX() < e2.getX()) { //如果初始触点的X坐标比最终触点的X坐标小表示向右滑动
viewFlipper.showPrevious();
} return super.onFling(e1, e2, velocityX, velocityY);
}
}

最后通过简单代码在onCreate()方法内初始化改监听方法:

CustomGestureDetector customGestureDetector = new CustomGestureDetector();
gestureDetector = new GestureDetector(this, customGestureDetector);

并在onTouchEvent()回调中实现getstureDetector.onTouchEvent(event);

@Override
public boolean onTouchEvent(MotionEvent event){
gestureDetector.onTouchEvent(event); return super.onTouchEvent(event);
}

此外,还可以通过ViewFlipper为图片切换增加动画效果:

viewFlipper.setInAnimation(this, android.R.anim.fade_in);
viewFlipper.setInAnimation(this, android.R.anim.fade_out);

如果希望应用能够自动切换图片,还可以通过ViewFlipper设置图片自动播放和播放时间:

viewFlipper.setAutoStart(true);
viewFlipper.setFlipInterval(2000);

参考:

http://codetheory.in/android-viewflipper-and-viewswitcher/

Android ViewFlipper用法浅析的更多相关文章

  1. ViewSwitcher用法浅析

    如果理解了ViewPager的使用方法,使用ViewSwitcher就方便多了.和ViewFlipper一样,ViewSwitcher也是ViewAnimator的子类,并且只能包含两个子视图,每次展 ...

  2. 从 ListView 到 RecyclerView 的用法浅析

    文章目录 要走好明天的路,必须记住昨天走过的路,思索今天正在走着的路. ListView,一种在垂直滚动列表中显示条目的视图:RecyclerView,一种在局限的窗口呈现大数据集合的灵活视图.Rec ...

  3. Android Meun 用法

    Android Meun 用法 点击菜单实体键弹出菜单:如下图 main_activity.xml <?xml version="1.0" encoding="ut ...

  4. Android ViewPager 用法

    Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...

  5. Android Intent 用法全面总结

    [代码全屏查看]-Android Intent 用法全面总结 // [1].[代码] 调用拨号程序 跳至 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] / ...

  6. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  7. Android ScrollView用法

    Android ScrollView用法 今天试着使用了一下Android的滚轮,以下是一个小小的测试,读取测试文件,主要是使用scrollTo函数和getScrollY(),程序点击BUTTON按钮 ...

  8. Android源码浅析(六)——SecureCRT远程连接Linux,配置端点和字节码

    Android源码浅析(六)--SecureCRT远程连接Linux,配置端点和字节码 需要编译源码的同学,一般都是win+虚拟机吧,但是再虚拟机里体验并不是很好,所有市面上有很多的软件能够做到在wi ...

  9. Android源码浅析(五)——关于定制系统,如何给你的Android应用系统签名

    Android源码浅析(五)--关于定制系统,如何给你的Android应用系统签名 今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如 修改系统时间 静默安装 执行某shell命令 ...

随机推荐

  1. FTP远程命令集

    使用ftp命令进行远程文件传输 ftp命令是标准的文件传输协议的用户接口.ftp是在TCP/IP网络上的计算机之间传输文件的简单有效的方法.它允许用户传输ASCII文件和二进制文件. 在ftp会话过程 ...

  2. Sqlite表的结构修改

    Sqlite删除列方法 http://blog.csdn.net/aben_2005/article/details/6563538 SQLite3 table 结构修改 http://blog.cs ...

  3. Java组各任务工作流程

    1.周枫 A.提供基于SQL SERVER的数据库基本表结构创建脚本,基础数据脚本,按学科(产品)的数据脚本. 2.吴缤 A.提供给周茉的安装包用的项目文件,共三个digital,xylinkWeb和 ...

  4. uva 387 A Puzzling Problem (回溯)

     A Puzzling Problem  The goal of this problem is to write a program which will take from 1 to 5 puzz ...

  5. 利用FluorineFx的ByteArray上传图片

    Flex端利用new PNGEncoder().encode(bitmapData)将png图片转换为ByteArray,然后传给服务器,服务端需要定义一个public ByteArray Uploa ...

  6. defer和async的区别

    先来试个一句话解释仨,当浏览器碰到 script 脚本的时候: <script src="script.js"></script> 没有 defer 或 a ...

  7. 使用贝赛尔曲线画扇形、圆形、弧线、多边形,实现App下载时的动画效果demo

    // // MyView.swift // TestUIBezierPath // // Created by iCodeWoods on 16/5/8. // Copyright © 2016年 i ...

  8. 用systemtap对sysbench IO测试结果的分析1

    http://www.actionsky.com/docs/archives/171  2016年5月6日  黄炎 近期在一些简单的sysbench IO测试中, 遇到了一些不合常识的测试结果. 从结 ...

  9. C# 之 集合整理

    集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问):一个集合包括多个元素,即有一个集合类对象和N个元素对象. BCL(Base Class Library, 基类库) ...

  10. socket通信简介

    转:http://blog.csdn.net/xiaoweige207/article/details/6211577 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的 ...