TabActivity实现手指左右滑动切换页面
2015-12-17 17:38
537 查看
在做项目的时候主界面有好几个tab, 有些用户习惯性的左右滑屏来切换tab,所以添加了左右滑屏切换他变得功能。
基本思想:
dispatchTouchEvent在接收到用户触屏时间之后被触发,所在在dispatchTouchEvent中获取当前用户事件,判断是滑动,则执行切换tab,并且终止当前触屏事件。否则则正常流程。
实现方式:
private GestureDetector gestureDetector; // 用户滑动
gestureDetector = new GestureDetector(new TabHostTouch());
private int flaggingWidth;// 互动翻页所需滚动的长度是当前屏幕宽度的1/3
// 获取分辨率
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
flaggingWidth = dm.widthPixels / 3;
[java] view
plaincopy
private class TabHostTouch extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (Math.abs(e1.getX() - e2.getX()) > Math.abs(e1.getY()
- e2.getY())
&& (e1.getX() - e2.getX() <= (-flaggingWidth) || e1.getX()
- e2.getX() >= flaggingWidth)) {
if (e1.getX() - e2.getX() <= (-flaggingWidth)) {
currentTabID = mTabHost.getCurrentTab() - 1;
if (currentTabID < 0) {
currentTabID = mTabHost.getTabCount() - 1;
}
mTabHost.setCurrentTab(currentTabID);
return true;
} else if (e1.getX() - e2.getX() >= flaggingWidth) {
currentTabID = mTabHost.getCurrentTab() + 1;
if (currentTabID >= mTabHost.getTabCount()) {
currentTabID = 0;
}
mTabHost.setCurrentTab(currentTabID);
return true;
}
}
return false;
}
}
override dispatchTouchEvent
[java] view
plaincopy
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
event.setAction(MotionEvent.ACTION_CANCEL);
}
return super.dispatchTouchEvent(event);
}
在写好了tab,之后修订的功能,所以只是为了实现这个功能而实现。
应该是可以直接用ViewPager实现这个效果的。
~~~~~~~~
android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatch和Intercept,只有touchEvent。
转载地址:/article/7769394.html
基本思想:
dispatchTouchEvent在接收到用户触屏时间之后被触发,所在在dispatchTouchEvent中获取当前用户事件,判断是滑动,则执行切换tab,并且终止当前触屏事件。否则则正常流程。
实现方式:
private GestureDetector gestureDetector; // 用户滑动
gestureDetector = new GestureDetector(new TabHostTouch());
private int flaggingWidth;// 互动翻页所需滚动的长度是当前屏幕宽度的1/3
// 获取分辨率
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
flaggingWidth = dm.widthPixels / 3;
[java] view
plaincopy
private class TabHostTouch extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (Math.abs(e1.getX() - e2.getX()) > Math.abs(e1.getY()
- e2.getY())
&& (e1.getX() - e2.getX() <= (-flaggingWidth) || e1.getX()
- e2.getX() >= flaggingWidth)) {
if (e1.getX() - e2.getX() <= (-flaggingWidth)) {
currentTabID = mTabHost.getCurrentTab() - 1;
if (currentTabID < 0) {
currentTabID = mTabHost.getTabCount() - 1;
}
mTabHost.setCurrentTab(currentTabID);
return true;
} else if (e1.getX() - e2.getX() >= flaggingWidth) {
currentTabID = mTabHost.getCurrentTab() + 1;
if (currentTabID >= mTabHost.getTabCount()) {
currentTabID = 0;
}
mTabHost.setCurrentTab(currentTabID);
return true;
}
}
return false;
}
}
override dispatchTouchEvent
[java] view
plaincopy
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
event.setAction(MotionEvent.ACTION_CANCEL);
}
return super.dispatchTouchEvent(event);
}
在写好了tab,之后修订的功能,所以只是为了实现这个功能而实现。
应该是可以直接用ViewPager实现这个效果的。
~~~~~~~~
android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatch和Intercept,只有touchEvent。
转载地址:/article/7769394.html
相关文章推荐
- 搜索区间——LintCode
- mybatis之map.xml文件的解读
- OC面试常见
- 第十章 设计用户界面 之 构建UI布局
- $(function(){…});与(function($) {…})(jQuery);
- tabs选项卡切换效果(jquery版)
- HDFS源码分析(三)-----数据块关系基本结构
- bat运行runnable jar file
- Mysql安装步骤
- floyed(记录路径)
- WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效
- IE浏览器兼容问题
- redis 学习手册之java和php连接redis操作
- 什么是 Conversion to Dalvik format failed ?
- nginx记录响应与POST请求日志
- 自定义Hive Sql Job分析工具
- Matlab 条形图绘制 以及 添加误差棒 改变条形图形状
- 编程思维
- map的insert会自动忽略重复key,而不是替换
- 添加jar