Android开发——实现TabHost 随手滑动切换选项卡功能(绝对实用)


以前用TabHost只是点击导航栏选项卡才进行切换,今天试了下手势滑动进行切换,搜了好多资料感觉特别乱,花了好长时间整理了一下终于有效果了,自己写了一个Demo。

程序清单1:布局文件

说明:和我们写Tabhost布局文件一样

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

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

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TabHost

android:id="@android:id/tabhost" android:layout_width="fill_parent"

android:layout_height="fill_parent">

<LinearLayout android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent">

<TabWidget android:id="@android:id/tabs"

android:layout_width="fill_parent" android:layout_height="wrap_content" />

<FrameLayout android:id="@android:id/tabcontent"

android:layout_width="fill_parent" android:layout_height="fill_parent" >

<LinearLayout

android:focusable="true"

android:focusableInTouchMode="true"

android:id="@+id/tab01"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:text="你好"

android:textSize="20sp"/>

<ListView

android:id="@+id/listview"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:dividerHeight="10dp"

android:divider="#D1D1D1"

>

</ListView>

</LinearLayout>

<LinearLayout

android:id="@+id/tab02"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:text="你好"

android:textSize="20sp"/>

<ListView

android:id="@+id/listview1"

android:layout_width="match_parent"

android:layout_height="match_parent">

</ListView>

</LinearLayout>

<LinearLayout

android:id="@+id/tab03"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:text="你好"

android:textSize="20sp"/>

<ListView

android:id="@+id/listview2"

android:layout_width="match_parent"

android:layout_height="360dp"

>

</ListView>

</LinearLayout>

</FrameLayout>

</LinearLayout>

</TabHost>

</LinearLayout>

程序清单2:

MainActivity.java

public class MainActivity extends TabActivity {

private static final int SWIPE_MIN_DISTANCE = 120;

private static final int SWIPE_MAX_OFF_PATH = 250;

private static final int SWIPE_THRESHOLD_VELOCITY = 200;

private GestureDetector gestureDetector;

View.OnTouchListener gestureListener;

private Animation slideLeftIn;

private Animation slideLeftOut;

private Animation slideRightIn;

private Animation slideRightOut;

private ViewFlipper viewFlipper;

int currentView = 0;

private static int maxTabIndex = 2;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TabHost tabHost = getTabHost();

tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1 ")

.setContent(R.id.tab01));

tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2 ")

.setContent(R.id.tab02));

tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3 ")

.setContent(R.id.tab03));

tabHost.setCurrentTab(0);

slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);

slideLeftOut = AnimationUtils

.loadAnimation(this, R.anim.slide_left_out);

slideRightIn = AnimationUtils

.loadAnimation(this, R.anim.slide_right_in);

slideRightOut = AnimationUtils.loadAnimation(this,

R.anim.slide_right_out);

gestureDetector = new GestureDetector(new MyGestureDetector());

gestureListener = new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

if (gestureDetector.onTouchEvent(event)) {

return true;

}

return false;

}

};

}

class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

TabHost tabHost = getTabHost();

try {

if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)

return false;

if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE

&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

Log.i("test ", "right");

if (currentView == maxTabIndex) {

currentView = 0;

} else {

currentView++;

}

tabHost.setCurrentTab(currentView);

} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE

&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

Log.i("test ", "left");

if (currentView == 0) {

currentView = maxTabIndex;

} else {

currentView--;

}

tabHost.setCurrentTab(currentView);

}

} catch (Exception e) {

// nothing

}

return false;

}

}

//@Override

//public boolean onTouchEvent(MotionEvent event) {

//if (gestureDetector.onTouchEvent(event))

//return true;

//else

//return false;

//}

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

if(gestureDetector.onTouchEvent(event)){

event.setAction(MotionEvent.ACTION_CANCEL);

}

return super.dispatchTouchEvent(event);

}

}

当然这里会用到关于滑动的四个xml文件   我们将它们存在 res\anim中 (anim文件要自己新建)

1、 slide_left_in

2、slide_lefe_out

3、slide_right_in

4、slide_right_out

1、 slide_left_in.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate

android:duration="500"

android:fromXDelta="100%p"

android:toXDelta="0" />

<alpha

android:duration="500"

android:fromAlpha="0.0"

android:toAlpha="1.0" />

</set>

2、slide_lefe_out.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate

android:duration="500"

android:fromXDelta="0"

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

<alpha

android:duration="500"

android:fromAlpha="1.0"

android:toAlpha="0.0" />

</set>

3、slide_right_in.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate

android:duration="500"

android:fromXDelta="-100%p"

android:toXDelta="0" />

<alpha

android:duration="500"

android:fromAlpha="0.0"

android:toAlpha="1.0" />

</set>

4、slide_right_out.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate

android:duration="1500"

android:fromXDelta="0"

android:toXDelta="100%p" />

<alpha

android:duration="1500"

android:fromAlpha="1.0"

android:toAlpha="0.1" />

</set>

好了现在就完成了。来几张效果图:

时间: 2024-11-25 14:50:48

Android开发——实现TabHost 随手滑动切换选项卡功能(绝对实用)的相关文章

Android开发:app工程集成银联支付功能(客户端)

Android开发:app工程集成银联支付功能(客户端) email:[email protected] 上一篇博文完成了服务器端的集成,可参考: Android开发:app工程集成银联支付功能(服务器端).这一篇博文完成客户端的集成. 一.功能描述 银联支付流程如下所示: 上一篇尝试了tn的获取,本篇将跑通整个流程. 二.实现部分 先说一下我的IDE是as(Android Studio)+win7 64位 2.1配置,依旧是配置 按照官方说明文档,就可以完成,我在这里贴上结构图,因为as的特殊

[Android] 使用Include布局+Fragment滑动切换屏幕

    前面的文章已经讲述了"随手拍"项目图像处理的技术部分,该篇文章主要是主界面的布局及屏幕滑动切换,并结合鸿洋大神的视频和郭神的第一行代码(强推两人Android博客),完成了下面的内容:     (1).学习使用Include布局XML     (2).通过添加适配器加载fragment     (3).实现滑动触摸切换屏幕ViewPager     (4).改变图标及背景,并响应fragment中控件及传递参数 参考资料: 郭霖大神的<Android第一行代码> 鸿

【Android UI】案例03滑动切换效果的实现(ViewPager)

本例使用ViewPager实现滑动切换的效果.本例涉及的ViewPager,为android.support.v4.view.ViewPager.所以需要在android项目中导入android-support-v4.jar. 本例中ViewPager是实现滑动效果的核心部分.对其设置PageChangeListener监听事件,是实现滑动效果的核心思路. [转载使用,请注明出处:http://blog.csdn.net/mahoking] 首先是主界面layout.xml文件,activity

Android防微信首页左右滑动切换

大家看到微信首页切换效果有没有觉得很炫,滑动切换,点击底部bar瞬间切换,滑动切换渐变效果,线上效果图: 之前也在博客上看到别人的实现,再次基础上,我做了些优化.首先说下实现原理,大神略过,o(╯□╰)o 页面上看到的三个页面是三个Fragment, 左右滑动使用viewpager,相信大家也都是这么再用,那么底部用的是什么技术呢,底部渐变其实就是重写了ImageView,以及在左右滑动时,改变了TextView的颜色值,是不是很简单...下面我们一步一步的来: 1.自定义ImageView:

android开发之定制ViewPager滑动事件

明天还要加班,苦逼的程序猿,简单说说最近遇到的一个问题吧. 我在viewpager+fragment学习笔记中简单介绍过ViewPager+Fragment的用法,其实并不难,当时实现了一个如下图所示的效果: 然而,在实际开发中这一点技术可能根本不够用,项目中会有各种各样奇葩的需求,我最近就遇到了一个怪异的需求,捣鼓之后还是解决了,今天和大家聊聊. 由于涉及到公司项目,我在这里就使用我自己制作的一个Demo来和大家介绍. 我们要实现的效果如下图: 这里一共有三个Fragment,其中两个通过左右

Android开发之密码明文密文切换显示

.xml文件 <LinearLayout 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" tools:contex

Android开发:app工程集成银联支付功能(服务器端)

一功能描述 二实现过程 1下载银联支付SDK和Demo 1银联商家服务地址httpsopenunionpaycomajwebindex 2下载的文件如下 2集成过程 1先试官方Demo 2集成到自己的工程里 一.功能描述 因为是自己开发了一个app应用,没资格去申请微信支付和支付宝支付,于是就采用了银联支付功能,银联支付分为了两种环境:测试环境和生产环境,一般前期开发的时候都是使用测试环境,数据都是测试数据,不会发生真实交易.第一次做Android项目+IDE为Android Studio+第一

Android开发教程--自定义接听/挂断电话功能

1.首先在manifest中加入如下的权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" > </uses-permission> <uses-permission android:name=

小程序 开发之向左滑动实现删除功能

为了让用户的体验效果有一个很大的提升,在删除 单行信息 的 时候,我们逐渐从点击删除到向左 滑动实现删除.那么小程序的左滑删除是怎么实现的呢? 效果如图: 第一步:先进行页面的布局: <!-- 自定义单选/多选/全选实现删除功能 --> <view class="item-box"> <view class="items"> <view wx:for="{{list}}" wx:key="{{i