在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. 你尽力了么===BY cloudsky

    /////////////////////////////////////////////////////////////////////////// 这是我的同事alert7在他主页上转scz的&l ...

  2. 使用foreach碰到的问题

    foreach($list as $k=>$v ){ ........... } 和下面: foreach($list as &$v){ ........ } 其实两者的结果是一样的,但 ...

  3. Circle-Progress-View

    https://github.com/jakob-grabner/Circle-Progress-View

  4. BBOSS框架使用jquery方式传參到后台的时候,要注意的事项

    BBOSS框架.从前台传到后台的时候,參数要以这样的方式: public String initAddOrModExtendUser(HttpServletRequest request,       ...

  5. oc-29-可变数组

    /** 数组长度不固定,可以随便往里面添加或者删除元素. 1.创建数组 NSMutableArray *arrayM = [NSMutableArray array] 2.给数组添加元素(只能是OC对 ...

  6. 终端I/O之终端标识

    历史沿袭至今,在大多数UNIX系统中,控制终端的名字是/dev/tty. POSIX.1提供了一个运行时函数,可被用来确定控制终端的名字. #include <stdio.h> char ...

  7. QT 操作oracle数据库遇到的问题

    一.首先参考官方文档: http://qt-project.org/doc/qt-4.8/sql-driver.html#qoci 二.编译驱动: http://www.tuicool.com/art ...

  8. mysql主从复制 主从配置(windows系统上)

    OS:Windows7 DB:MYSQL5.6.2 1.正常安装第一个mysql(安装步骤省略)  2.在控制面板里停止第一个mysql服务  3.将C:\Program Files\MySQL目录下 ...

  9. 基于jQuery带图标的多级下拉菜单

    之前为大家分享了很多导航菜单.今天我们要来分享一款很不错的jQuery左侧带小图标的多级下拉菜单,菜单是垂直的,每一个菜单项带有一个小图标,看起来非常专业.并且菜单支持无限极下拉,所以对各位Web开发 ...

  10. Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariable--转载

    原文地址: @RequestMapping is one of the most widely used Spring MVC annotation.org.springframework.web.b ...