public class Main 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.main);
TabHost tabHost = getTabHost();
tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1 ")
.setContent(new Intent(this, Activity1.class)));
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2 ")
.setContent(new Intent(this, Activity2.class)));
tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3 ")
.setContent(new Intent(this, Activity3.class)));
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 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;
// right to left swipe
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文件如下:
<?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">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/button1"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ImageButton>
<ImageButton
android:id="@+id/button2"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ImageButton>
</LinearLayout>
<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>
</TabHost>
</LinearLayout>
分享到:
相关推荐
本示例中的"手势滑动切换activity"是通过结合使用`TabHost`和`ViewPager`组件来实现的,这两种组件在Android应用设计中都有着重要的作用。 `TabHost`是Android系统提供的一个容器,它允许开发者创建带有标签页的...
描述中的“简单的例子 能够运行流畅 是想手机一样的 通过手指左右滑动切换tabhost”进一步强调了这个功能的实际应用和效果。这意味着开发者已经成功地实现了TabHost与手势识别的结合,使得用户可以像操作智能手机主...
4. **关联TabHost和ViewPager**:为了实现滑动切换选项卡的效果,开发者需要监听TabHost的选中事件,并根据选中的标签改变ViewPager当前显示的页面。这通常是通过设置TabHost的OnTabChangeListener来实现的。 5. **...
4. **处理滑动手势**: 为了使用户可以通过左右滑动切换Activity,需要监听ViewPager的滑动事件。这可以通过在ViewPager中设置OnPageChangeListener实现。当页面滑动时,更新TabLayout中的选中标签。 5. **菜单项和...
本教程将详细讲解如何通过手势控制TabHost中的Activity切换,这对于初学者来说是一份宝贵的资源。 首先,我们要理解手势识别(Gesture Recognition)在Android中的应用。Android SDK提供了一个叫做...
通过查看和分析这些文件,开发者可以学习如何在实际项目中实现选项卡滑动切换效果,包括自定义滑动动画、响应手势事件以及优化用户体验等方面的知识。 总之,“Tab选项卡页面滑动切换”是一个功能强大且实用的UI...
总结,这个示例项目展示了如何在Android应用中使用FragmentActivity、TabLayout和ViewPager来实现一个功能完善的多标签页界面,同时通过手势支持平滑的滑动切换。这种方法不仅适用于API 19及以上的设备,而且符合...
在Android开发中,`...通过这样的方式,我们可以实现一个功能完善的、可滑动切换的TabHost,提供给用户更友好的交互体验。在实际开发中,还可以根据需求进一步定制,比如添加滑动监听事件、处理页面间的数据传递等。
在本案例中,我们将讨论如何利用`ViewPager` 实现类似`TabHost` 的滑动切换效果,但不包含`TabHost` 传统的彩色指示条。 首先,`ViewPager` 是Android Support Library的一部分,它提供了一个可以水平滑动的视图...
在安卓开发中,`ViewPager` 和 `TabHost` 是两种常用的组件,它们分别用于实现页面的滑动切换和标签页的展示。`ViewPager` 提供了流畅的左右滑动效果,而 `TabHost` 则是传统的标签栏控件,但不支持滑动切换。在某些...
"android 滑动的tabhost"是指将传统的TabHost与手势滑动结合,实现更流畅、更具互动性的用户体验。在本教程中,我们将深入探讨如何实现这样一个功能,并涉及以下几个关键知识点: 1. **TabHost基本用法**: - ...
然而,标准的TabHost功能有限,往往需要进行自定义以满足更复杂的需求,如动态添加选项、自动水平滑动以及手势切换选项卡。下面我们将深入探讨如何实现这样的自定义TabHost。 一、自定义TabHost的基本原理 自定义...
在这个源码Demo中,开发者可能将TabHost与ViewPager结合,以利用TabHost的标签显示功能和ViewPager的滑动切换特性。具体实现方式可能是这样的: 1. 首先,创建一个TabHost实例,并添加所需的标签页。每个标签页可能...
在标题提到的“可滑动的tabhost”中,`ViewPager`被用来实现标签的滑动切换效果,而不是使用默认的点击切换。这种方式可以提供更流畅的用户体验,因为用户可以直接通过手势在各个页面之间切换,而不需要点击标签。 ...
`ViewPager`允许用户通过手势左右滑动来切换页面,非常适合用于展示大量内容的场景,如新闻、图片或卡片视图。 `TabHost`则是Android原生的标签栏组件,可以承载多个`TabSpec`,每个`TabSpec`对应一个`Intent`,...
然后,他们会集成SlidingMenu,通常是将菜单布局嵌入到主Activity的根布局中,并监听滑动手势。为了使SlidingMenu与TabHost协同工作,可能需要在某些事件(如Tab切换)中调整菜单的状态。 总的来说,这个例子展示了...
4. 通过TabHost的`setup()`方法将ViewPager和TabHost关联起来,确保TabHost的切换事件能够驱动ViewPager的页面切换。 **114623rk20r802mk1ukrk9.png**: 这个文件可能是一个截图或示意图,展示了结合使用ViewPager和...
这个“可以横向拖动的TabHost”项目提供了一种创新的交互方式,让用户可以通过水平滑动来切换不同的Tab,而非传统的点击按钮。下面我们将深入探讨TabHost的基本概念、可拖动的实现原理以及如何在实际开发中应用这一...
- 通常的做法是将`TabHost`的每个Tab内容替换为一个`ViewPager`,这样用户不仅可以通过点击Tab切换,还可以通过滑动手势在各个Tab之间切换。 - `ViewPager`的每个页面可以是一个Fragment,每个Fragment代表`...
它通常用于展示一系列的Fragment,用户可以通过手势左右滑动来切换页面,也可以设置指示器来显示当前所处的页面。 接下来,我们讨论如何将这两者结合: **步骤1:创建TabHost** 在布局文件中,我们需要定义一个...