Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取android中是否执行了收缩放大或收缩缩小_Android_Google Maps - Fatal编程技术网

如何获取android中是否执行了收缩放大或收缩缩小

如何获取android中是否执行了收缩放大或收缩缩小,android,google-maps,Android,Google Maps,我正在开发一个应用程序,其中我使用了自定义mapView,在该mapView上,如果用户按压(两个手指手势),则地图的相机位置应相应更改,例如,如果用户按压放大,相机缩放应放大地图(仅屏幕中心),如果用户按压缩小,应缩小地图的相机变焦(仅限于屏幕中心)。我已经试过了,但对于放大和缩小,地图总是在放大。有没有办法找到两个手指之间的距离在增加/减少,或者手势在缩小或放大 更新 MainActivity.java public class MainActivity extends AppCompatA

我正在开发一个应用程序,其中我使用了自定义mapView,在该mapView上,如果用户按压(两个手指手势),则地图的相机位置应相应更改,例如,如果用户按压放大,相机缩放应放大地图(仅屏幕中心),如果用户按压缩小,应缩小地图的相机变焦(仅限于屏幕中心)。我已经试过了,但对于放大和缩小,地图总是在放大。有没有办法找到两个手指之间的距离在增加/减少,或者手势在缩小或放大

更新

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int LOCATION_PERMISSION_CONSTANT = 34;

    private static final int REQUEST_CHECK_SETTINGS = 12;

    //private EnhanchedMapView mapView;
    private MapView mapView;

    private GoogleMap googleMap;
    private FusedLocationProviderClient mFusedLocationClient;
    private Location mLastLocation;
    LocationManager locationManager;
    private TextView tvCoordinates;
    private GoogleApiClient googleApiClient;



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

        bindUI();
        mapView.onCreate(savedInstanceState);
        fusedLocationMethod(savedInstanceState);
        getLocationPermission();
        //getLastLocation();
    }

    private void bindUI() {
        mapView = findViewById(R.id.map_view);
        tvCoordinates = findViewById(R.id.tv_coordinates);

    }

   public void fusedLocationMethod(Bundle savedInstanceState) {
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    }

    private void getLocationPermission() {
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION},
                    LOCATION_PERMISSION_CONSTANT);
            return;
        }
        getLastLocation();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case LOCATION_PERMISSION_CONSTANT:
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (googleApiClient == null) {
                        getLocationPermission();
                    } else {
                        getLocationPermission();
                    }
                } else {

                    Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }


    public void getLastLocation() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;
        }
        mFusedLocationClient.getLastLocation()
                .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        if (location == null) {
                            Log.w(TAG, "onSuccess:null");
                            return;
                        }

                        mLastLocation = location;
                        preLat = location.getLatitude();
                        preLong = location.getLongitude();
                        settingMap(location.getLatitude(), location.getLongitude());

                        try {
                            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.d("Error", e.getMessage() + " 203");
                        }

                        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                            return;
                        }

                    }
                })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "getLastLocation:onFailure", e);
                    }
                });
    }

    private double preLat = 0.0;
    private double preLong = 0.0;

    //setting map
    private void settingMap(final double lat, final double longi) {
        mapView.getMapAsync(new OnMapReadyCallback() {


            @Override
            public void onMapReady(GoogleMap gglmap) {


                googleMap = gglmap;
                googleMap.getUiSettings().setAllGesturesEnabled(false);
                googleMap.clear();
                CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(lat, longi)).zoom(16).build();

                googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

                googleMap.getUiSettings().setMyLocationButtonEnabled(false);

                //permission for location
                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                    return;
                }
                googleMap.setMyLocationEnabled(true);


                //googleMap.getUiSettings().setAllGesturesEnabled(false);
                googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
                    @Override
                    public void onCameraIdle() {

                        int mapViewHeight = mapView.getHeight();
                        int mapViewWidth = mapView.getWidth();

                        Projection projection = googleMap.getProjection();

                        LatLng geographicalPosition = projection.fromScreenLocation(new Point(mapViewWidth / 2, mapViewHeight / 2));
                        //     Toast.makeText(getActivity(),""+geographicalPosition.latitude+" , "+geographicalPosition.longitude,Toast.LENGTH_LONG).show();


                        tvCoordinates.setText(geographicalPosition.latitude + "   ,   " + geographicalPosition.longitude);
                    }
                });

            }
        });


    }


    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }


    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        mapView.onSaveInstanceState(savedInstanceState);
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }


}
public类MainActivity扩展了AppCompatActivity{
私有静态最终字符串标记=MainActivity.class.getSimpleName();
私有静态最终整数位置\许可\常数=34;
私有静态最终整数请求检查设置=12;
//私有EnhanchedMapView地图视图;
私有地图视图;
私人谷歌地图谷歌地图;
私有FusedLocationProviderClient mFusedLocationClient;
私人场所;
地点经理地点经理;
私有文本视图;
私人GoogleapClient GoogleapClient;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindUI();
onCreate(savedInstanceState);
fusedLocationMethod(savedInstanceState);
getLocationPermission();
//getLastLocation();
}
私有void bindUI(){
mapView=findViewById(R.id.map\u视图);
tvCoordinates=findViewById(R.id.tv_坐标);
}
public void fusedLocationMethod(Bundle savedInstanceState){
mFusedLocationClient=LocationServices.getFusedLocationProviderClient(此);
}
私有void getLocationPermission(){
if(ActivityCompat.checkSelfPermission(这个,android.Manifest.permission.ACCESS\u FINE\u位置)
!=PackageManager.PERMISSION\u已授予和&ActivityCompat.checkSelfPermission(此,android.Manifest.PERMISSION.ACCESS\u位置)!=PackageManager.PERMISSION\u已授予){
ActivityCompat.requestPermissions(此,
新字符串[]{android.Manifest.permission.ACCESS\u FINE\u LOCATION,android.Manifest.permission.ACCESS\u rough\u LOCATION},
位置(许可(常数);
返回;
}
getLastLocation();
}
@凌驾
公共无效onRequestPermissionsResult(int requestCode,
字符串权限[],int[]grantResults){
开关(请求代码){
案例位置\权限\常量:
//如果取消请求,则结果数组为空。
如果(grantResults.length>0
&&grantResults[0]==PackageManager.PERMISSION\u已授予){
if(googleApiClient==null){
getLocationPermission();
}否则{
getLocationPermission();
}
}否则{
Toast.makeText(这是“拒绝许可”,Toast.LENGTH_SHORT).show();
}
打破
}
}
public void getLastLocation(){
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
返回;
}
mFusedLocationClient.getLastLocation()文件
.addOnSuccessListener(此,新的OnSuccessListener(){
@凌驾
成功时的公共无效(位置){
if(位置==null){
w(标记“onSuccess:null”);
返回;
}
mLastLocation=位置;
preLat=location.getLatitude();
preLong=location.getLongitude();
settingMap(location.getLatitude(),location.getLatitude());
试一试{
locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
}捕获(例外e){
e、 printStackTrace();
Log.d(“错误”,例如getMessage()+“203”);
}
if(ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
返回;
}
}
})
.addOnFailureListener(此,新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“getLastLocation:onFailure”,e);
}
});
}
专用双预拉特=0.0;
私人双预长=0.0;
//设定图
专用空位设置图(最终双纵、最终双纵){
getMapAsync(新的OnMapReadyCallback(){
@凌驾
已于4月1日公开作废(谷歌地图){
谷歌地图=谷歌地图;
googleMap.getUiSettings().setAllGesturesEnabled(false);
googleMap.clear();
CameraPosition CameraPosition=new CameraPosition.Builder().target(new LatLng(lat,longi)).zoom(16.build();
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPositi
public class EnhanchedMapView extends MapView implements OnMapReadyCallback {
    private long mLastTouchTime = -1;
    private static final int INVALID_POINTER_ID = -1;

    private OnMapReadyCallback mMapReadyCallback;
    private GoogleMap mGoogleMap;

    private float mPosX;
    private float mPosY;

    private float mLastTouchX;
    private float mLastTouchY;
    private int mActivePointerId = INVALID_POINTER_ID;

    private void init() {
    }

    @Override
    public void getMapAsync(OnMapReadyCallback callback) {
        mMapReadyCallback = callback;

        super.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;
    }

    LatLng geographicalPosition;
    boolean isPinch = false;

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        switch (event.getAction() & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN:
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);

                long thisTime = System.currentTimeMillis();
                if (thisTime - mLastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {

                    if (mGoogleMap != null) {
                        LatLng zoomCenter = mGoogleMap.getProjection().fromScreenLocation(new Point((int) event.getX(), (int) event.getY()));
                        float currentZoom = mGoogleMap.getCameraPosition().zoom;

                        int mapViewHeight = getHeight();
                        int mapViewWidth = getWidth();

                        Projection projection = mGoogleMap.getProjection();

                        geographicalPosition = projection.fromScreenLocation(new Point(mapViewWidth / 2, mapViewHeight / 2));

                        MarkerOptions markerOptions = new MarkerOptions();
                        markerOptions.position(geographicalPosition);
                        mGoogleMap.addMarker(markerOptions);
                        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(geographicalPosition.latitude, geographicalPosition.longitude), currentZoom + 1));

                    }
                    mLastTouchTime = -1;
                } else {
                    mLastTouchTime = thisTime;
                    mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
                }

                break;

            case MotionEvent.ACTION_POINTER_DOWN:
                mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
                Log.d("Nirmal", "ACTION_POINTER_DOWN");
                isPinch = true;

                int mapViewHeight = getHeight();
                int mapViewWidth = getWidth();

                Projection projection = mGoogleMap.getProjection();

                geographicalPosition = projection.fromScreenLocation(new Point(mapViewWidth / 2, mapViewHeight / 2));


                break;

            case MotionEvent.ACTION_POINTER_UP:
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);

                isPinch = false;
                break;

            case MotionEvent.ACTION_UP:
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);
                break;

            case MotionEvent.ACTION_MOVE:
                if (isPinch) {
                    if (mGoogleMap == null || geographicalPosition == null)
                        break;
                    //Log.d("Nirmal", "ACTION_MOVE");
                    Log.d("Nirmal", "" + event.getX() + " , " + event.getY());


                    float currentZoom = mGoogleMap.getCameraPosition().zoom;

                    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(geographicalPosition.latitude, geographicalPosition.longitude), currentZoom + 0.05f));

                }
                break;

        }

        return super.dispatchTouchEvent(event);
    }


}
ScaleGestureDetector mScaleDetector = new ScaleGestureDetector(getContext(),
        new ScaleGestureDetector.SimpleOnScaleGestureListener() {

            private float scaleFactor = 1f;

            @Override
            public boolean onScale(ScaleGestureDetector detector) {
                // store scale factor for detect zoom "direction" on end
                scaleFactor = detector.getScaleFactor();
                return true;
            }

            @Override
            public void onScaleEnd(ScaleGestureDetector detector) {
                float currentZoom = mGoogleMap.getCameraPosition().zoom;
                if (scaleFactor > 1) {
                    // zoom in detected
                    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mZoomCenter, currentZoom + 1));
                } else if (scaleFactor < 1) {
                    // zoom out detected
                    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mZoomCenter, currentZoom - 1));
                }
                super.onScaleEnd(detector);
            }
        });
...
@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    // just call .onTouchEvent() on your ScaleGestureDetector object
    mScaleDetector.onTouchEvent(event);

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    ...
@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
    ...
}