关闭

重写Activity的dispatchTouchEvent与百度地图MapView事件冲突

标签: 百度地图TouchEent无法拖动
570人阅读 评论(0) 收藏 举报
分类:

dispatchTouchEvent(),该方法负责分发用户的触摸事件,而是否拦截该事件则由onInterceptTouchEent()决定,但最终的响应事件应该还是取决于onTouchEvent()。


触摸事件首先到达Activity的dispatchTouchEvent(), 然后对Activity的子控件进行遍历并依次调用它们的dispatchTouchEvent(),当子控件为ViewGroup时,重复这一过程,当子控件为View时,View的dispatchTouchEvent()会返回其OnTouchEvent()的执行结果,true表示消费了事件,当ViewGroup的所有子控件都返回false时,才会调用ViewGroup自身的onTouchEvent()(除非ViewGroup复写onInterceptTouchEvent()拦截了事件,这样事件将不会传递到子控件,而是直接到ViewGroup的OnTouchEvent())


当在activity页面中添加MapView时,因为Activity重写了dispatchTouchEvent()做一些手势控制,为了使这部份手势控制在MapView上失效,所以在Activity的MotionEvent_UP事件中给dispatchTouchEvent()返回了true,结果导致MapView中的事件都只能响应到MotionEvent_MOVE,即缩放按键按下后不能弹起,无法拖拽地图,但是可以通过两个手指缩放之类……这些动作显然是MapView重写了onTouchEvent方法,如果在父控件就拦截MontionEvent的话便会导致MapView的手势控制出现问题


明白了原因就好改啦


在Activity的dispatchTouchEvent()中,当判断MotionEvent_UP的坐标点在MapView时,应该return父类调用super.dispatchTouchEvent(ev)让事件继续向下传递而非return true或false,这样才可以使MotionEvent_UP事件继续传递到MapView构成一次完整的触摸事件,又因为MapView已经消费了事件,所以也不用担心MapView会触发Activity的手势控制啦~。~

//在Activity的dispatchTouchEvent()中对MotionEvent.ACTION_UP事件做处理:
if (mCurrentFragment instanceof PathFragment){
                    PathFragment fragment = (PathFragment)mCurrentFragment;
                    if (fragment.isTouchMap(upY)){
                        return super.dispatchTouchEvent(ev);
                    }
                }
                if (offsetX < -50 && Math.abs(offsetY)<200){
                    nextFragment();
                    return true;//可以在此返回布尔值,则UP事件便不会在向下传递了,这样如果坐标在控件时也就不会触发其点击事件。
                }else if (offsetX > 50 && Math.abs(offsetY)<200){
                    prevFragment();
                    return true;
                }
//在fragment中创建判断事件坐标点是否在地图上的方法:
public boolean isTouchMap(float upY) {
        int[] location = new int[2];
        mapView.getLocationInWindow(location);
        if (upY>location[1]){
            //mapView.dispatchTouchEvent(ev);
            return true;
        }
        return false;
    }

总之,不要轻易给dispatchTouchEvent()返回boolean值,除非你不想传递事件或者只想传递不完整的触摸事件…

附: android onTouch()与onTouchEvent()的区别
1.onTouch方法:
onTouch方法是View的 OnTouchListener借口中定义的方法。
当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。
(当把手放到View上后,onTouch方法被一遍一遍地被调用)

2.onTouchEvent方法:
onTouchEvent方法是override 的Activity的方法。
重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
(当把手放到Activity上时,onTouchEvent方法就会一遍一遍地被调用)

3.touch事件的传递:
在一个Activity里面放一个TextView的实例tv,并且这个tv的属性设定为 fill_parent
在这种情况下,当手放到屏幕上的时候,首先会是tv响应touch事件,执行onTouch方法。

如果onTouch返回值为true,
表示这个touch事件被onTouch方法处理完毕,不会把touch事件再传递给Activity,
也就是说onTouchEvent方法不会被调用。
(当把手放到屏幕上后,onTouch方法被一遍一遍地被调用)

如果onTouch的返回值是false,
表示这个touch事件没有被tv完全处理,onTouch返回以后,touch事件被传递给Activity,
onTouchEvent方法被调用。
(当把手放到屏幕上后,onTouch方法调用一次后,onTouchEvent方法就会一遍一遍地被调用)

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

有这样一个需求场景,要用百度地图,且要放在Fragment中,百度地图左右拖动就会和ViewPager的滑动事件冲突,这类似两可拖动控件的冲突,网上的方法大致如下: 1、父View继承ViewPager,重写方法,如: public class CustomViewPager extends Vi...
  • langyuewu
  • langyuewu
  • 2014-12-05 10:10
  • 4971

ViewPager与DrawerLayout以及百度MapView之间滑动冲突的解决

在CSDN看大牛们写的博客,总是会对他们的才华钦佩得不行。今天我也要写下我的第一篇博客,一来走走大牛们走过的路,鞭策自己提高技术;二来记录下自己的思路;三来希望对遇到相同问题的朋友提供帮助。好了废话不多说了,进入主题。本人使用ViewPager实现两个Fragment之间的相互切换,第一个Fragm...
  • zhangweiocp
  • zhangweiocp
  • 2015-03-29 19:52
  • 2275

事件分发系列—View中的dispatchTouchEvent和onTouchEvent分析

View的dispatchTouchEvent和onTouchEvent源码分析
  • be_happy_mr_li
  • be_happy_mr_li
  • 2016-05-11 17:56
  • 4477

在Fragment中集成百度地图

1.下载百度地图SDK,下面是官方下载地址: http://developer.baidu.com/map/index.php?title=androidsdk/sdkandev-download 2.根据http://lbsyun.baidu.com/index.php?title=andro...
  • liliwei2658
  • liliwei2658
  • 2016-03-30 14:59
  • 788

13.View的事件分发机制——dispatchTouchEvent详解

在前面的第二篇文章中,我们提过,View的事件分发是一种委托思想:上层委托下层,父容器委托子元素来处理这个流程。接下来,我们就将深入去学习View的事件分发机制。 1.事件的传递流程     事件,在Android中对应的类是MotionEvent,因此,我们...
  • savelove911
  • savelove911
  • 2016-05-12 15:42
  • 7348

Android版百度地图MapView维护(dialog中放一个MapView)

最近项目工程使用百度地图,功能确实强大,但就像论坛里很多人提的那样,在MapView的刷新问题上,百度地图还有一定bug,比如在一个dialog中放一个MapView,却发现dialog中的MapView展现效果很差,很多地图上的标志没有刷新出来。比如下图 我们可以看到整个地图完全乱套了,...
  • rongwenbin
  • rongwenbin
  • 2014-09-22 10:30
  • 1029

android 模仿百度地图自定义对话框

首先上图片   自定一对话框需要自己写对话框样式,在res-values-styles中添加自己的对话框样式 @style/AnimBottom --> @null true true tr...
  • panyaorui
  • panyaorui
  • 2014-03-07 14:53
  • 1730

Android Touch事件分发—拦截—处理

Android Touch事件分发(dispatchTouchEvent)—拦截(onInterceptTouchEvent)—处理(onTouchEvent)转自:http://www.cnblogs.com/linjzong/p/4191891.html(跟人感觉短小精悍有透彻)Touch事件分...
  • SetO2
  • SetO2
  • 2016-02-26 16:46
  • 1491

BaiduMap---百度地图官方Demo之多地图展示(在一个Activity中创建多个地图展示)

xmlns:map="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     andr...
  • IT1039871366
  • IT1039871366
  • 2015-07-01 17:20
  • 1401

android之scrollview滑动和地图拖动冲突

可能有人在做地图的时候会碰见,由于需求,把地图放在scrollview中的,但是当手指在地图上想上下拖动地图的时候发现地图没办法拖动,反而是scrollview在滑动了。这是因为地图拖动事件被拦截,执行的是scrollview的scroll事件,那么此时怎么办呢? 很简单,我们手指在地图上的时候就执...
  • gsw333
  • gsw333
  • 2016-03-04 15:04
  • 1698
    个人资料
    • 访问:6126次
    • 积分:150
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:2篇
    • 译文:0篇
    • 评论:8条
    文章分类