Android:双层嵌套ViewPager并添加单击事件
仿网易新闻:

实现原理:
上面的导航栏是一个自定义的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
Android:双层嵌套ViewPager并添加单击事件的更多相关文章
- Android向系统日历中添加日程事件
转自Android向系统日历中添加日程事件 总结 在项目开发中,我们有预约提醒.定时提醒需求时,可以使用系统日历来辅助提醒: 通过向系统日历中写入事件.设置提醒方式(闹钟),实现到时间自动提醒的功能: ...
- dcef3 为按钮添加单击事件
http://ju.outofmemory.cn/entry/78083 dcef3 为按钮添加单击事件 BccSafe's Blog 2014-06-01 3706 阅读 DOM 演示dcef3操作 ...
- Android ScrollView嵌套ViewPager,嵌套的ViewPager无法显示
记录:ScrollView嵌套ViewPager,嵌套的ViewPager无法显示 项目中所需要布局:LinearLayout中包含(orientation="vertical") ...
- Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; ...
- Repeater控件三层嵌套-内层Repeater添加绑定事件
用Repeater三层嵌套,最外层Repeater可以生成自己的ItemCommand事件.但接下来中间层因为是嵌套了的,所以无法在属性窗口中生成自己的事件.如果手动敲入则无效. 解决办法是需要通过编 ...
- 在WPF的DataGrid中对行添加单击事件
在做的一个c#的项目中发现Datagrid没办法直接对鼠标单击进行响应,调用MouseDown事件也需要点击某一行第二次才能响应.所以借助EventSetter来简单的实现了一个. 界面部分的代码 & ...
- 页面中插入flash,并且给flash添加单击事件控制播放,以及获取相关参数.
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" hei ...
- 一步一步学android之事件篇——单击事件
在使用软件的时候单击事件必不可少,比如我想确定.取消等都需要用户的单击,所有的单击事件都是由View.OnClickListener接口来进行处理的,接口定义如下: public static int ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
随机推荐
- Agile.Net 组件式开发平台 - 开发环境部署
环境准备: Windows 7 (32/64) Windows Server 2008 (32/64) Microsoft SQL Server 2008 R2 (32/64) Microsoft V ...
- mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法
http://www.jb51.net/article/58726.htm 今天发现网站有点慢,发现mysql日志中提示mysqld-nt: Out of memory (Needed 1677720 ...
- PetaPoco更新记录方法
/// <summary> /// Performs an SQL update /// </summary> /// <param name="tableNa ...
- 开启或关闭SQLSERVER服务的bat文件
界面如下: 因为电脑的SQLSERVER服务没有自己启动,有时候又需要关闭SQLSERVER服务,就自己在网上找了下教程. 源码如下: @echo offchoice /t 3 /c yn /d y ...
- android 权限总结
1.拨打电话要权限 2.sd目录存东西要权限
- Python入门一:基本数据类型
作为一个刚入门编程的大一狗,第一次写博客,希望能对自己学的知识进行巩固和提升,也希望记录自己成长的过程. 学习Python,一是因为暑假学的c++头疼,听说Python简单,那我就试试吧,二是因为Py ...
- 数据结构与算法C语言实现笔记(1)--表
声明:此一系列博客为阅读<数据结构与算法分析--C语言描述>(Mark Allen Weiss)笔记,部分内容参考自网络:转载请注明出处. 1.表 表是最简单的数据结构,是形如A1.A2. ...
- python中functools.wraps装饰器的作用
functools.wraps装饰器用于显示被包裹的函数的名称 import functools def node(func): #@functools.wraps(func) def wrapped ...
- Asp.Net检查HTML是否闭合以及自动修复
1.htmlCheck类 using System; using System.Collections.Generic; using System.Text; using System.Collect ...
- Swagger+AutoRest
Swagger+AutoRest 生成web api客户端(.Net) 简介 对于.net来说,用web api来构建服务是一个不错的选择,都是http请求,调用简单,但是如果真的要在程序中调用, ...