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

由于项目紧张,就不自己总结了,,亲测之后,很完美!!


有这样一个需求场景,要用百度地图,且要放在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统,可以是移动应用、网页服务或集成到智能农业设备。 7. **实时监测**:在实际应用,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值