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