Android 谷歌地图:检测谷歌地图上的向下移动事件

Android 谷歌地图:检测谷歌地图上的向下移动事件,android,google-maps,Android,Google Maps,为了能够在我的应用程序中用一根手指(口袋妖怪go风格的东西)将地图绕着用户旋转360度,我想出了以下解决方案 我在包含映射的整个片段上放置了一个视图,并向其中添加了一个onTouchListener,因为映射不能设置onTouchListener。当用户拖动一个手指时,下面的代码会旋转地图,实际上它工作得很好 previousMapTouchX = 0.0f; previousMapTouchY = 0.0f; coveringView.setOnTouchListen

为了能够在我的应用程序中用一根手指(口袋妖怪go风格的东西)将地图绕着用户旋转360度,我想出了以下解决方案

我在包含映射的整个片段上放置了一个视图,并向其中添加了一个onTouchListener,因为映射不能设置onTouchListener。当用户拖动一个手指时,下面的代码会旋转地图,实际上它工作得很好

    previousMapTouchX = 0.0f;
    previousMapTouchY = 0.0f;

    coveringView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            float x = motionEvent.getX();
            float y = motionEvent.getY();

            switch (motionEvent.getAction()) {

                case MotionEvent.ACTION_MOVE:

                    Log.e("MAP", "MOVE");

                    float dx = x - previousMapTouchX;
                    float dy = y - previousMapTouchY;

                    // reverse direction of rotation above the mid-line
                    if (y > coveringView.getHeight() / 2) {
                        dx = dx * -1 ;
                    }

                    // reverse direction of rotation to left of the mid-line
                    if (x < coveringView.getWidth() / 2) {
                        dy = dy * -1 ;
                    }

                    CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()),
                            googleMap.getCameraPosition().zoom, MAX_TILT,
                            googleMap.getCameraPosition().bearing + ((dx + dy) * TOUCH_SCALE_FACTOR)));

                    googleMap.moveCamera(cameraUpdate);
                    break;

                case MotionEvent.ACTION_DOWN:
                    Log.e("MAP", "DOWN");
                    return false;

            }

            previousMapTouchX = x;
            previousMapTouchY = y;
            return true;

        }
    });
previousMapTouchX=0.0f;
先前的maptuchy=0.0f;
coveringView.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图、运动事件、运动事件){
float x=motionEvent.getX();
float y=motionEvent.getY();
开关(motionEvent.getAction()){
case MotionEvent.ACTION\u移动:
Log.e(“地图”、“移动”);
float dx=x-上一个MapTouchx;
float dy=y-先前的mappothy;
//中线以上的反向旋转方向
如果(y>coveringView.getHeight()/2){
dx=dx*-1;
}
//旋转方向与中线左侧相反
if(x
然而问题是,虽然我可以旋转地图,但标记变得不可触摸,因为顶部的视图正在消耗所有触摸事件。因此,如果检测到MotionEvent.ACTION\u DOWN,我添加了一个case以返回false。但是,这同样有效,因为用户显然总是在“动作”\u“移动”动作之前执行“动作”\u“向下”动作,这意味着永远不会达到贴图旋转代码

我陷入了这样一种情况:我可以正确旋转地图,但无法选择地图标记,或者可以选择地图标记,但无法旋转地图


有没有人对我如何让它工作有什么建议?如果谷歌地图可以有一个onTouchListener,那就容易多了。

您可以禁用所有地图手势,并将触摸事件从覆盖视图发送到地图视图:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private GoogleMap mMap;
    private View mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapView = mapFragment.getView(); // get the map view to dispatch touch events to it
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap googleMap) {
        mMap = googleMap;

        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(40, 4), 18));
        mMap.addMarker(new MarkerOptions().position(new LatLng(40, 4)).title("My marker"));

        mMap.getUiSettings().setAllGesturesEnabled(false); // disable all the map gestures

        View coveringView = findViewById(R.id.coveringView);
        coveringView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(final View view, final MotionEvent motionEvent) {
                // Do your stuff here

                mapView.dispatchTouchEvent(motionEvent); // dispatch the touch event from the covering view to the map view
                return true;
            }
        });
    }
}

工作起来很有魅力!非常感谢安东尼奥