ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法
一、上图
二、场景描写叙述
最近在做项目的时候。遇到一个怪异的需求,描写叙述例如以下:
1、ViewPager中嵌套3个View,当从View1滑动到View2时禁止ViewPager的滑动事件。
2、通过View2底部改变页面的布局实现滑动到View1和View3.
3、View2内嵌的View中还存在一个能够左右滑动的View。在其上加入了手势。即支持左右滑动,这里存在事件冲突,须要通过事件分发来进行处理。
三、问题解决思路
1、禁止ViewPager滑动。主要是不让ViewPager运行scrollTo(int x,int y)这种方法。这个參考了网上的做法,即自己定义一个ViewPager。通过设置一个开关标志位。来决定是否运行scrollTo方法。代码例如以下:
package com.example.viewpagerscrollconflict.views; import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent; public class CustomViewPager extends ViewPager {
private static final String TAG = "CustomViewPager"; private boolean isCanScroll = true; public CustomViewPager(Context context) {
super(context);
} public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
} public void setScanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
} public boolean isCanScroll() {
return isCanScroll;
} @Override
public void scrollTo(int x, int y) {
if (isCanScroll) {
super.scrollTo(x, y);
}
} /**
* 事件分发
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i(TAG, "====dispatchTouchEvent====事件分发");
if(getCurrentItem() == 1){
isCanScroll = false;
this.requestDisallowInterceptTouchEvent(true); }
return super.dispatchTouchEvent(ev);
} /**
* 事件拦截
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(TAG, "====onInterceptTouchEvent====事件拦截");
return super.onInterceptTouchEvent(ev);
} /**
* 事件响应
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i(TAG, "====onTouchEvent====事件响应");
return super.onTouchEvent(event);
}
}
2、要实现View2底部改变页面的布局滑动到View1和View3
这里主要是为改变页面的布局加入滑动手势来进行滑动切换的。
(稍后给出源代码)
3、ViewPager与其内嵌的View水平滑动事件冲突解决思路(上主要代码)
(1)当处在View2页面时。首先让ViewPager禁止滑动。
(2)将事件分发给View2内嵌的View让其依据用户的手势进行滑动。
/**
* 事件分发
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i(TAG, "====dispatchTouchEvent====事件分发");
if(getCurrentItem() == 1){
isCanScroll = false;
//告诉ViewPager不要拦截子View中的各种事件
this.requestDisallowInterceptTouchEvent(true);
}
return super.dispatchTouchEvent(ev);
}
三、Activity中的代码
package com.example.viewpagerscrollconflict; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener; import com.example.viewpagerscrollconflict.adapters.ViewPagerAdapter;
import com.example.viewpagerscrollconflict.gestures.ViewPagerGestureListener;
import com.example.viewpagerscrollconflict.views.CustomViewPager;
import com.example.viewpagerscrollconflict.views.ScrollLinearLayout; public class MainActivity extends Activity{
private static final String TAG = "MainActivity";
private GestureDetector mDetector;
/**布局载入器**/
private LayoutInflater inflater;
private CustomViewPager mVpViewPager;
private ViewPagerAdapter vpAdapter;
private View v1, v2, v3;
private List<View> viewList;
private ScrollLinearLayout sllChangePage; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mVpViewPager = (CustomViewPager) findViewById(R.id.vp_view_pager);
inflater = LayoutInflater.from(this);
v1 = inflater.inflate(R.layout.layout_1, null);
v2 = inflater.inflate(R.layout.layout_2, null);
v3 = inflater.inflate(R.layout.layout_3, null); mDetector = new GestureDetector(this, new ViewPagerGestureListener(mVpViewPager));
sllChangePage = (ScrollLinearLayout) findViewById(R.id.sll_change_page);
sllChangePage.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mDetector.onTouchEvent(event);
return true;
}
}); viewList = new ArrayList<View>();
viewList.add(v1);
viewList.add(v2);
viewList.add(v3);
vpAdapter = new ViewPagerAdapter(viewList);
mVpViewPager.setAdapter(vpAdapter);
mVpViewPager.setOnPageChangeListener(new MyPageChangeListener());
} class MyPageChangeListener implements OnPageChangeListener { @Override
public void onPageScrollStateChanged(int arg0) { } @Override
public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override
public void onPageSelected(int arg0) {
switch (arg0) {
case 0:
Log.i(TAG, "=======page=======" + arg0);
break;
case 1:
Log.i(TAG, "=======page=======" + arg0);
if (!mVpViewPager.isCanScroll()) {//假设不能够滑动
Log.i(TAG, "在页面1中。不能够滑动");
mVpViewPager.setCurrentItem(1);
}
break;
case 2:
Log.i(TAG, "=======page=======" + arg0);
if (!mVpViewPager.isCanScroll()) {//假设不能够滑动
Log.i(TAG, "在页面2中。不能够滑动");
mVpViewPager.setCurrentItem(1);
}
break;
}
} } }
四、项目源代码下载链接
http://download.csdn.net/detail/xiogjie_67/8897119
ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法的更多相关文章
- scrollview嵌套listview 滑动事件冲突的解决方法
listView.setOnTouchListener(new View.OnTouchListener() { @Override ...
- 关于Android滑动冲突的解决方法(二)
之前的一遍学习笔记主要就Android滑动冲突中,在不同方向的滑动所造成冲突进行了了解,这样的冲突非常easy理解,当然也非常easy解决.今天,就同方向的滑动所造成的冲突进行一下了解,这里就先以垂直 ...
- Android ViewPager+Fragment 在Activity中获取Fragment的控件
如果ViewPager+Fragment实现Tab切换,在activity中利用adapter.getItem获取到fragment然后再根据fragment.的方法获取控件 //隐藏求租,以下代码用 ...
- vue项目使用前端框架开发,实现滑动效果,若不刷新页面则无法达到预期效果的问题及解决方法
滑动等效果的初始化时机很重要,在vue项目开发中,需到mounted()钩子函数 (当组件中的DOM结构被渲染好并放到页面中后,会执行这个钩子函数,此时即可初始化滑动效果的js代码). 若组件未挂载到 ...
- WP8__实现ListBox横向滑动及子项绑定图片等控件
<!--实现绑定的图片等信息 ListBox水平滚动--> <Grid> <Grid.Resources> <Style x:Key="horizo ...
- Viewpager禁止滑动
参考:http://www.jianshu.com/p/d3d766cf73d7 public class NoScrollViewPager extends ViewPager { private ...
- Android导航菜单横向左右滑动并和下方的控件实现联动
这个是美团网个人订单的效果,找了很多地方都没找到,自己研究了两天终于弄出来了^_^,有什么问题希望大家指出来,谢谢. 实现原理是上方使用HorizontalScrollView这个可以水平横向拖动的控 ...
- webview滑动事件 与内部html左右滑动事件冲突问题的解决办法
最近在做个混合app , 用html做页面,然后通过webview嵌套在activity中,效果是这样: 开始还是比较顺利,增加了菜单退出按钮,返回键页面回退功能,页面加载显示加载图标(在app端实现 ...
- Android 实现 IOS相机滑动控件
IOS相比于Android,动画效果是一方面优势,IOS相机切换时滑动的动画很不错,看着是有一个3D的效果,而且变化感觉很自然.Android也可以通过Graphics下面的Camera可以实现3D ...
随机推荐
- Eclipse4.4安装旧版本插件报错 Failed to prepare partial IU
Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0.8. work around: go to Help -> ...
- XMLHelper 类
这个XMLHelper类中包括了XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现,有兴趣的朋友,可以进来看看,所有代码都在WebForm和WinForm中调试通过. 这是下面 ...
- [转]mysql 的日志的启动与查看
mysql有以下几种日志:错误日志: -log-err查询日志: -log慢查询日志: -log-slow-queries更新日志: -log-update二进制日志:-log-bin 日志 ...
- 你好,C++(35)类是如何藏私房钱的?6.2.4 拷贝构造函数
6.2.6 类成员的访问控制 类成员包括类的成员变量和成员函数,它们分别用来描述类的属性和行为.而类成员的访问控制决定了哪些成员是公开的,可以被外界访问,也可以被自身访问:哪些成员是私有的,只能在类 ...
- zend studio设置
1.字体设置: 第一步:进入设置窗口 windows -> preferences 第二步:进入修改字体的选项卡. General -> Appearance -> Co ...
- C语言笔记(结构体与offsetof、container_of之前的关系)
关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...
- (转)总结PLSQL的快捷键以及使用技巧
最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他同事使用PLSQL 编程效率明显高于自己,观察了好久,才发现他使用PLSQL 已经很长时间了而且,他自己也在其中添加了好多快捷方式, ...
- The working copy xxxx needs to be upgraded to Subversion 1.7.
原因是我在svn是低版本时候checkout的项目 而对方用的版本比我高 然后 我运行这个项目 就要求我 更新 如果我选择 对项目进行upgrade. 当 upgrade后 我的项目就在 现有 ...
- JS基于时间戳写的浏览访问人数
Title:JS基于时间戳写的浏览访问人数 --2013-12-23 14:07 <script language="JavaScript"> var timesta ...
- js中undefined,null,NaN的区别
1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型.var a1;var a2 = true;va ...