ViewPager与百度地图冲突的纯净解决方案

来源:互联网 发布:8080端口怎么关闭 编辑:程序博客网 时间:2024/06/06 01:56

有这样一个需求场景,要用百度地图,且要放在Fragment中,百度地图左右拖动就会和ViewPager的滑动事件冲突,这类似两可拖动控件的冲突,网上的方法大致如下:

1、父View继承ViewPager,重写方法,如:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class CustomViewPager extends ViewPager {    
  2.     
  3.     private boolean isCanScroll = true;    
  4.     
  5.     public CustomViewPager(Context context) {    
  6.         super(context);    
  7.     }    
  8.     
  9.     public CustomViewPager(Context context, AttributeSet attrs) {    
  10.         super(context, attrs);    
  11.     }    
  12.     
  13.     public void setScanScroll(boolean isCanScroll){    
  14.         this.isCanScroll = isCanScroll;    
  15.     }    
  16.     
  17.     
  18.     @Override    
  19.     public void scrollTo(int x, int y){    
  20.         if (isCanScroll){    
  21.             super.scrollTo(x, y);    
  22.         }    
  23.     }    

又如:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private boolean isCanScroll = true;  
  2. public void setScanScroll(boolean isCanScroll){    
  3.        this.isCanScroll = isCanScroll;    
  4. }   
  5.   
  6. @Override  
  7. public boolean onTouchEvent(MotionEvent ev) {  
  8. if (isCanScroll== false) {  
  9. return false;  
  10. else {  
  11. return super.onTouchEvent(ev);  
  12. }  
  13.   
  14. }  
  15.   
  16. @Override  
  17. public boolean onInterceptTouchEvent(MotionEvent ev) {  
  18. if (isCanScroll== false) {  
  19. return false;  
  20. else {  
  21. return super.onInterceptTouchEvent(ev);  
  22. }  
  23.   
  24. }  

又或者其它相似的实现,然后子View实现setOnTouchListener,在UP和DOWN中,通过设定isCanScroll的相反值,调用父View重写的方法控制


2、父View不做处理,子View实现setOnTouchListener,在UP和DOWN中,分别调用下面的方法(用于通知父控件是否拦截事件):

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. getParent().requestDisallowInterceptTouchEvent(true or false)   

然而这两种方法对于我的场景有很大弊端!因为定义了是否拦截Touch事件,当未拦截时,子View的OnTouch事件有效,但是一切换到拦截状态,子View的OnTouch事件无效,即上面的代码会作废,并会一直保持这个状态,


后来,终于给我找到一篇文章(忘了名字),里面有个方法:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Override    
  2.     protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {    
  3.         // Not satisfied with this method of checking...    
  4.         // working on a more robust solution    
  5.         if(v.getClass().getName().equals("maps.j.b")) {    
  6.             return true;    
  7.         }    
  8. }    
其中“maps.j.b”不知道什么含义的,不是相当于魔数么?

然后我加了个断点,调试进去一看,v.getClass()就是可触发Scroll的控件的类名,如在MapView拖动,会先后两次进来,分别是ViewPager和MapView,那“maps.j.b”这个魔数换成“com.baidu.mapapi.map.MapView”是否可以了?一试,果然!!!

于是,纯净的解决冲突方法就是:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class ViewPagerCompat extends ViewPager {  
  2.   
  3.         public ViewPagerCompat(Context context) {    
  4.             super(context);    
  5.         }    
  6.         
  7.         public ViewPagerCompat(Context context, AttributeSet attrs) {    
  8.             super(context, attrs);    
  9.         }    
  10.           
  11.           
  12.         @Override    
  13.         protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {    
  14.             if(v.getClass().getName().equals("com.baidu.mapapi.map.MapView")) {    
  15.                 return true;    
  16.             }    
  17.             //if(v instanceof MapView){    
  18.             //    return true;    
  19.             //}    
  20.             return super.canScroll(v, checkV, dx, x, y);   
  21.        }   
  22. }  

然后用这个ViewPagerCompat代替原来的ViewPager使用即可,从之衍生,其它类似组件冲突应该也可这样处理
0 0
原创粉丝点击