前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谷歌地图与 NestedScrollView 滑动冲突

谷歌地图与 NestedScrollView 滑动冲突

作者头像
贺biubiu
发布2019-03-19 17:17:23
1.3K0
发布2019-03-19 17:17:23
举报
文章被收录于专栏:HLQ_Struggle

LZ-Says:情不知往矣,一往情深。

前言

话说,前段时间被地图虐个半死,那酸爽程度,简直无与伦比。

一会儿,要访问外国网站;一会儿,网络不稳定,白屏了;一会儿,某些设备不支持 GMS 服务了。

怎一个无奈至极。

某天,项目收尾时,愕然发现在某页 Google Map 与当前页面滑动冲突,最直接的表现结果便是,手指触摸地图进行滑动时,地图视觉卡顿且页面会随着手指滑动而滑动,顿时很蛋疼,脑海第一想法事件分发,拦截丫的不就好了吗,最直接的,触摸地图的时候,父容器别管我不就好了。可惜,初步猜测谷歌 Baba 喜欢捉妖,自己搞了一通骚操作,肿么办,内心有点小躁动。

这里感谢 Stack Overflow,业界良心呐~!!!

一起来看解决之道~

秀儿,是你么?

首先,重写 SupportMapFragment ,这里主要通过 dispatchTouchEvent 进行事件分发,也可以简单理解为在这里我们去控制地图与父容器之间事件传递。

代码语言:javascript
复制
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.google.android.gms.maps.SupportMapFragment;

/**
 * @author: heliquan
 * @data: 2019/1/11
 * @desc: 解决谷歌地图与 NestedScrollView 滑动冲突
 *        https://stackoverflow.com/questions/41689968/google-map-fragment-scrolling-inside-nestedscrollview
 */
public class MySupportMapFragment extends SupportMapFragment {

    private OnTouchListener mListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View layout = super.onCreateView(inflater, parent, savedInstanceState);
        TouchableWrapper frameLayout = new TouchableWrapper(getActivity());
        frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
        ((ViewGroup) layout).addView(frameLayout,
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        return layout;
    }

    public void setListener(OnTouchListener listener) {
        mListener = listener;
    }

    public interface OnTouchListener {
        public abstract void onTouch();
    }

    public class TouchableWrapper extends FrameLayout {

        public TouchableWrapper(Context context) {
            super(context);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mListener.onTouch();
                    break;
                case MotionEvent.ACTION_UP:
                    mListener.onTouch();
                    break;
                default:
            }
            return super.dispatchTouchEvent(event);
        }
    }

}

接着,在布局中将 fragment 指定为自定义的 SupportMapFragment:

代码语言:javascript
复制
<fragment
    android:id="@+id/mv_map"
    android:name="com.heliquan.ui.weight.MySupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

最后,实例化地图的同时告诉父容器,您老还是踏实呆着吧。

代码语言:javascript
复制
private var mapFragment:MySupportMapFragment?=null

mapFragment = supportFragmentManager
        .findFragmentById(R.id.mv_map) as MySupportMapFragment
if (mapFragment != null)
    mapFragment!!.setListener { mDataBinding.nsv.requestDisallowInterceptTouchEvent(true) }
mapFragment!!.getMapAsync(this)

到这里,小手点点冲突问题变解决咯~

还是要多去积累,多去深入。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 贺biubiu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档