1. onTouchListener();                       //捕捉touch事件,比如说onDown

需要将可滑动的控件加上两个方法:(1)view.setOnTouchListener();  //实现可以touch

                  (2)  view.setLongClickAble();  //如果不加这个方法,这个view只会接受onDown()点击事件。onFling() onScroll()等方法不接受

此方法需要注意,其目的是接收控件的touch事件,哪需要就要在哪加上。比如说最外面的Layout,中间的ListView,尤其注意当有ScrollView时一定要给它也加上这个方法,否则ScrollView里面的控件会不接受onFling()方法。

2.  GestureDetector   //手势识别

其中我们要使用的是继承了GestureDetector.onDoubleTapLisener和GestureDetector.OnGestureListener的GestureDetector.SimpleOnGestureListener。其中重写onFling()方法。此方法是在快速滑动屏幕时才会执行,正好符合我们的功能。

中间我们要把自定义的GestureDetector类与控件的onTouch()方法关联起来。在Activity中实现View.OnTouchListener(),重写它的方法:

GestureDetector detector = new GestureDetector(new MySimpleGestureDetector());

  public void onTouch(View view, MontionEvent event){

    return detector.onTouchEvent(event);   //关联

}

方法体如下:附注释

public class MySimpleGestureDetector extends GestureDetector.SimpleOnGestureListener {

private static final int MIN_DISTANCE = 100;        //最小距离
    private static final int MIN_VELOCITY = 100;        //最小滑动速率

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (Math.abs(velocityX) > MIN_VELOCITY) {
            if ((e2.getX() - e1.getX()) > MIN_DISTANCE) {  //向右滑动
                TabActivity.flingRight();
            } else if ((e1.getX() - e2.getX()) > MIN_DISTANCE) {  //向左滑动
                TabActivity.flingLeft();
            }
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }
}

3. 此时所有支持滑动的控件都加上了touch监听事件,并关联到自定义的SimpleGestureDetector里。并且在自定义的SimpleGestureDetector中重写的onFling()方法,处理了左右快速滑动操作。滑动最小距离为100px,X轴上滑动最小速率为100px/s。所以最后一步就是在你的TabActivity中处理左右滑动就可以了。附代码:

public static void flingLeft() {
        int currentTab = tabHost.getCurrentTab();
        if (currentTab != 0) {
            currentTab--;
            switchTab(currentTab);
        }
    }

public static void flingRight() {
        int currentTab = tabHost.getCurrentTab();
        if (currentTab != tabHost.getTabWidget().getChildCount()) {
            currentTab++;
            switchTab(currentTab);
        }
    }

private static void switchTab(final int toTab) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                tabHost.post(new Runnable() {
                    @Override
                    public void run() {
                        tabHost.setCurrentTab(toTab);
                    }
                });
            }
        }).start();
    }

这样一个支持左右滑动切换界面的Tab就做好了。

android tab之间滑动切换界面功能的更多相关文章

  1. 实现了在android实现左右滑动切换界面的效果

    这是实现了在android实现左右滑动切换界面的效果,该效果的源码下载,请到源码天堂下载吧,喜欢的朋友可以研究一下. 布局文件 <?xml version="1.0" enc ...

  2. Fragment+ViewPager实现仿微信点击和滑动切换界面

    这是在我写的新闻App中实现的界面切换 贴出切换界面的主要代码: xml代码: <span style="font-size:14px;"> <android.s ...

  3. 使用Android studio作按键切换界面

    一.新建工程 二.新建一个按键             android:layout_width="wrap_content"         android:layout_hei ...

  4. android 图片浏览器滑动切换图片

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  5. unity Tab键实现切换输入框功能

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...

  6. Android Activity之间经典切换动画

    package com.iteye.androidtoast; import java.util.ArrayList; import java.util.List; import android.ap ...

  7. android viewpager fragment 优化 切换界面 延时加载

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 使用 碎片的 设置用户可见暗示visible hint  这个方法来做到. hint 是 ...

  8. 【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析   1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3   2.Fragment生命周期以及与Activ ...

  9. 转载【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析  原文链接 http://www.cnblogs.com/monodin/p/3866441.html 1.使用场景 ViewPager+ ...

随机推荐

  1. RHCE7 -- systemctl命令

    查询所有单元的状态: [root@rhce7 ~]# systemctl UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_misc.automo ...

  2. 摘:分配和释放BSTR的内存

    当您创建 BSTR的并将它们使用以避免内存泄漏的它们在COM对象之间时,必须注意在将内存的.       当 BSTR 在接口中保持,必须释放其内存,当处理它.       但是,那么,当 BSTR ...

  3. Python2 元组 cmp() 方法

    描述 Python2 元组 cmp() 方法用于比较两个元组,如果 T1< T2返回 -1, 如果 T1== T2返回 0, 如果 T1> T2返回 1. 语法 cmp() 方法语法: c ...

  4. 关于 Chrome Console 查看DOM详情细节的奇思淫巧

    我们期待打印出的dom效果如下: 但某些时候,打印出来,或者通过$0.$1.document.getElementById('####') 等方式打印出来的效果如下: 根据第一幅图我们不难看出,当打印 ...

  5. 在ubuntu中配置深度学习python图片分类实验环境

    1 安装numpy,scipy, matplotlib, sudo apt-get install python-numpy sudo apt-get install python-scipy sud ...

  6. HTML DOM的总结

    DOM 是 Document Object Model(文档对象模型)的缩写,是 W3C(万维网联盟)的标准 W3C DOM 标准被分为 3 个不同的部分: 1.核心 DOM - 针对任何结构化文档的 ...

  7. SpringCloud 分布式配置

    转 http://www.cnblogs.com/zhangjianbin/p/6347247.html 前言 在单体式应用中,我们通常的做法是将配置文件和代码放在一起,这没有什么不妥.当你的应用变得 ...

  8. Android系统架构剖析(一)

          要说剖析,可能这个词可能用的太大了,以下对Android系统的介绍也就是从我个人理解来说吧.       以前有人问我,Android是什么?当时这个问题问的我真的蒙了,我就简单的回了一下 ...

  9. libgdx 1.4.1公布

    (转载自http://www.libgdx.cn/topic/4/libgdx-1-4-1%E5%8F%91%E5%B8%83) libgdx从未停止进步的脚步.10月10日.libgdx1.4.1公 ...

  10. 【Android】21.2 2D图形图像处理(Canvas和Paint)

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...