Android谷歌地图|两个手指滚动

时间:2017-09-20 11:19:53

标签: android google-maps scroll conditional custom-scrolling

我正在使用Google Map,

我的情况是我在 ScrollView 中有一个地图片段,我只需要用两根手指滚动地图如果用户只接触一个手指地图就不应该工作和普通的滚动视图应该有效。

这是我到目前为止所尝试的内容 -

transparent_image.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    switch (action & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_POINTER_DOWN:
                            showMessage("Double finger ACTION_POINTER_DOWN");

                            googleMap.getUiSettings().setScrollGesturesEnabled(false);
                            scroll_view.requestDisallowInterceptTouchEvent(true);
                            return true;
                        case MotionEvent.ACTION_POINTER_UP:
                            showMessage("Double finger ACTION_POINTER_UP");

                            googleMap.getUiSettings().setScrollGesturesEnabled(true);

                            scroll_view.requestDisallowInterceptTouchEvent(false);

                            return true;

                        default:
                            return true;
                    }
                }
            });

2 个答案:

答案 0 :(得分:9)

您可以在以下情况下实现原生Android应用程序的行为:

1)当用户将两根手指放在ScrollView上时,禁用GoogleMap滚动并启用MapFragment滚动;

2)启用ScrollView滚动并在其他情况下禁用GoogleMap滚动。

要按条件禁用/启用ScrollView滚动,您需要扩展ScrollView并覆盖onTouchEvent()方法以在匹配某些条件时返回false,例如,与this answerJosep Earl中一样:

public class LockableScrollView extends ScrollView {

    private boolean mScrollable = true;

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

    public LockableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setScrollingEnabled(boolean enabled) {
        mScrollable = enabled;
    }

    public boolean isScrollable() {
        return mScrollable;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // if we can scroll pass the event to the superclass
                if (mScrollable) return super.onTouchEvent(ev);
                // only continue to handle the touch event if scrolling enabled
                return mScrollable; // mScrollable is always false at this point
            default:
                return super.onTouchEvent(ev);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Don't do anything with intercepted touch events if
        // we are not scrollable
        if (!mScrollable) return false;
        else return super.onInterceptTouchEvent(ev);
    }
}

GoogleMap启用/停用滚动手势,您可以轻松拨打setAllGesturesEnabled() setScrollGesturesEnabled()对象上的GoogleMap.getUiSettings()MapFragment,并确定public class TouchableWrapper extends FrameLayout { private LockableScrollView mLockableScroll; private GoogleMap mGoogleMap; public TouchableWrapper(Context context) { super(context); } public void setGoogleMapAndScroll(GoogleMap googleMap, LockableScrollView lockableScroll) { mGoogleMap = googleMap; mLockableScroll = lockableScroll; } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mGoogleMap.getUiSettings().setScrollGesturesEnabled(false); // UPDATE: add below line to disable zoom gesture mGoogleMap.getUiSettings().setZoomGesturesEnabled(false); mLockableScroll.setScrollingEnabled(true); break; case MotionEvent.ACTION_POINTER_DOWN: mLockableScroll.setScrollingEnabled(false); mGoogleMap.getUiSettings().setScrollGesturesEnabled(true); // UPDATE: add below line to enable zoom gesture mGoogleMap.getUiSettings().setZoomGesturesEnabled(true); break; case MotionEvent.ACTION_POINTER_UP: // UPDATE: add below line to disable zoom gesture mGoogleMap.getUiSettings().setZoomGesturesEnabled(false); mGoogleMap.getUiSettings().setScrollGesturesEnabled(false); mLockableScroll.setScrollingEnabled(true); break; case MotionEvent.ACTION_UP: // UPDATE: add below line to disable zoom gesture mGoogleMap.getUiSettings().setZoomGesturesEnabled(false); mGoogleMap.getUiSettings().setScrollGesturesEnabled(false); mLockableScroll.setScrollingEnabled(true); break; } return super.dispatchTouchEvent(event); } } 上两个手指的触摸可以使用基于社区维基的this answer的方法:

MapFragment
在这种情况下,

public class MultiTouchMapFragment extends MapFragment { public View mOriginalContentView; public TouchableWrapper mTouchView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState); mTouchView = new TouchableWrapper(getActivity()); mTouchView.addView(mOriginalContentView); return mTouchView; } @Override public View getView() { return mOriginalContentView; } } 可以是这样的:

MainActivity

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { private LockableScrollView mLockableScrollView; private MultiTouchMapFragment mapFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLockableScrollView = (LockableScrollView) findViewById(R.id.lockable_scroll); mapFragment = (MultiTouchMapFragment) getFragmentManager() .findFragmentById(R.id.map_fragment); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { LatLng marker = new LatLng(48, 38); googleMap.addMarker(new MarkerOptions().position(marker).title("Scroll")); googleMap.getUiSettings().setAllGesturesEnabled(false); mapFragment.mTouchView.setGoogleMapAndScroll(googleMap, mLockableScrollView); } } 就是这样的(不需要在地图上添加标记 - 它仅用于测试):

activity_main.xml

最后,MainActivity <[your_package_name].LockableScrollView android:id="@+id/lockable_scroll" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:layout_width="match_parent" android:layout_height="300dp" android:src="@mipmap/ic_launcher"/> <fragment android:id="@+id/map_fragment" android:name="[your_package_name].MultiTouchMapFragment" android:layout_width="match_parent" android:layout_height="300dp"/> <ImageView android:layout_width="match_parent" android:layout_height="300dp" android:src="@mipmap/ic_launcher"/> </LinearLayout> </[your_package_name].LockableScrollView> 例如,可以是这样的:

@pi_names = PiName.order(last_name: :desc)

那就是它。

答案 1 :(得分:0)

var map = new google.maps.Map(document.getElementById('map'), {
          zoom: 4,
          center: myLatLng,
          gestureHandling: 'cooperative'
        });

有关详情,请查看此内容 https://maps-apis.googleblog.com/2016/11/smart-scrolling-comes-to-mobile-web-maps.html