Android:双层嵌套ViewPager并添加单击事件
2024-10-08 21:32:43
仿网易新闻:
实现原理:
上面的导航栏是一个自定义的ViewGroup(类似ActionBar)
中间内容层是ViewPager套fragment实现左右切换滑动
fragment里面的布局是一个ListView 附带下拉刷新和下拉加载效果
HeadView是一个ViewPager
双层ViewPager如果处理子ViewPager的滑动冲突问题和点击事件
通过自定义子ViewPager的方法:
public class TeacherViewPager extends ViewPager implements OnGestureListener { private GestureDetector mDetector; public TeacherViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
GestureDetector detector = new GestureDetector(context, this);
mDetector = detector;
} public GestureDetector getGestureDetector() {
return mDetector;
} @Override
public boolean onDown(MotionEvent e) {
return false;
} @Override
public void onShowPress(MotionEvent e) {
} @Override
public boolean onSingleTapUp(MotionEvent e) {
LogUtil.info("json", "onSingleTapUp");
if(listener != null) {
listener.setOnSimpleClickListenr(getCurrentItem());
}
return true;
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
} @Override
public void onLongPress(MotionEvent e) {
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
} private onSimpleClickListener listener; public interface onSimpleClickListener {
void setOnSimpleClickListenr(int position);
} public void setOnSimpleClickListener(onSimpleClickListener listener) {
this.listener = listener;
} }
onTouchEvent处理事件:
advPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) { advPager.getGestureDetector().onTouchEvent(event); // TODO Auto-generated method stub
final float x = event.getRawX();
final float y = event.getRawY(); switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
LogUtil.verbose("json", "ACTION_DOWN");
xDistance = yDistance = 0f;
mLastMotionX = x;
mLastMotionY = y;
case MotionEvent.ACTION_MOVE:
LogUtil.verbose("json", "ACTION_MOVE, x: " + x + ", y: " + y); final float xDiff = Math.abs(x - mLastMotionX);
final float yDiff = Math.abs(y - mLastMotionY);
xDistance += xDiff;
yDistance += yDiff; float dx = xDistance - yDistance;
LogUtil.info("json", "ACTION_MOVE dx= " + dx + ",xDistance: " + xDistance + ", yDistance: " + yDistance);
if (xDistance > yDistance || Math.abs(xDistance - yDistance) < 0.00001f) {
LogUtil.warn("json", "ACTION_MOVE interceptor.");
mIsBeingDragged = true;
mLastMotionX = x;
mLastMotionY = y;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);
} else {
mIsBeingDragged = false;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
LogUtil.verbose("json", "ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
LogUtil.verbose("json", "ACTION_CANCEL");
LogUtil.verbose("json", "mIsBeingDragged=" + mIsBeingDragged + " xDistance= " + xDistance + " y=" + yDistance);
if(mIsBeingDragged) {
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return false;
}
});
源码下载链接:http://files.cnblogs.com/gongcb/%E5%8E%8B%E7%BC%A9%E5%8C%85.zip
最新文章
- BLE 蓝牙协议栈开发
- 如何用linux命令查看nginx是否在正常运行
- Laravel 5.1 文档攻略 —— Eloquent:模型关系
- [Angularjs]ng-repeat中使用ng-model遇到的问题
- CSS:static/relative/absolute
- [Angular2 Router] Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable
- HDU 1041 Computer Transformation
- Git(一):Git与版本号控制简单介绍
- 【MVC】过滤器
- powerMock比easyMock和Mockito更强大(转)
- 还在繁琐的敲MVP接口和实现类吗,教你一秒搞定。
- web优化(一)
- Nagios 使用 NSClient++ 监控Windows Server
- python IO 多路复用
- Kitematic - VirtualBox is not installed. Docker for windows 10
- How To MD5SUM --- 如何检查MD5值?
- ES6 阮一峰阅读学习
- SharePoint BDC(Business Data Connectivity)服务-PowerShell
- redis迁移复制数据,主从关系建立实践
- Android中如何下载文件并显示下载进度
热门文章
- 常用经典SQL语句大全(提升)
- python出现Non-ASCII character &#39;\xe7&#39; in file ex6.py on line 1, but no encoding declare错误
- iOS夯实:ARC时代的内存管理
- 【html】【20】高级篇--轮播图[聚焦]
- 关于atoi的实现
- 双人五子棋对战(需要EasyX图像库)
- 堆排序 C++
- [翻译][MVC 5 + EF 6] 5:Code First数据库迁移与程序部署
- 使用json方式实现省市两级下拉级联菜单[原创]
- leetcode Permutations II 无重全排列