首页 > 其他分享 >工作篇 之 解决谷歌地图与 NestedScrollView 滑动冲突

工作篇 之 解决谷歌地图与 NestedScrollView 滑动冲突

时间:2022-11-10 21:01:34浏览次数:61  
标签:ViewGroup layout NestedScrollView 谷歌 地图 滑动 import android public


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



工作篇 之 解决谷歌地图与 NestedScrollView 滑动冲突_滑动冲突


前言

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

一会儿,要翻墙;一会儿,网络不稳定,白屏了;一会儿,某些设备不支持 GMS 服务了。

怎一个无奈至极。

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

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

一起来看解决之道~

秀儿,是你么?

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

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:

<fragment
android:id="@+id/mv_map"
android:name="com.heliquan.ui.weight.MySupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />

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

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)

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

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

个人公众号

不定期发布博文,最近有点忙,感谢老铁理解,欢迎关注~



工作篇 之 解决谷歌地图与 NestedScrollView 滑动冲突_Google Map_02


参考资料

  1. ​https://stackoverflow.com/questions/41689968/google-map-fragment-scrolling-inside-nestedscrollview;​


标签:ViewGroup,layout,NestedScrollView,谷歌,地图,滑动,import,android,public
From: https://blog.51cto.com/u_13346181/5842093

相关文章