lmw
2023-03-11 4df5bb59e5fe9f9d140e5610f7772dd8a05a28d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package com.fuban.driver.base.gaode;
 
import android.graphics.Bitmap;
import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
 
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdate;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.MyLocationStyle;
import com.amap.api.maps.model.Poi;
 
import com.fuban.driver.R;
import com.fuban.driver.base.MyBaseFragment;
 
import pub.devrel.easypermissions.EasyPermissions;
 
public abstract class BaseMapFragment
        extends MyBaseFragment implements AMap.InfoWindowAdapter, AMap.OnMyLocationChangeListener,
        AMap.OnMapClickListener, AMap.OnMarkerClickListener, LocationSource, AMap.OnPOIClickListener, AMapLocationListener {
    //手动请求权限列表
    public static String permissions_write = "android.permission.WRITE_EXTERNAL_STORAGE";
    public static String permissions_camera = "android.permission.CAMERA";
    //定位
    public static String permissions_location_fine = "android.permission.ACCESS_FINE_LOCATION";
    public static String permissions_location_coarse = "android.permission.ACCESS_COARSE_LOCATION";
    public AMap aMap = null;
    private MyLocationStyle mMyLocationStyle = null;
    //    public AMapLocationClient mlocationClient = null; //定位
//    public AMapLocationClientOption mLocationOption = null;//定位
    public Bundle savedInstanceState;//
    private MapView mapView;
//    public AMapLocation mAMapLocation;//实时定位的位置
 
 
    /**
     * 初始化地图
     */
    public void initMap(Bundle savedInstanceState, MapView mapView) {
        this.savedInstanceState = savedInstanceState;
        this.mapView = mapView;
        init(savedInstanceState, mapView);
        initLocation();
    }
 
    /**
     * 添加marker点
     */
    public Marker addMarker(String mLat, String mLng, View view, String peopleId) {
        MarkerOptions options = getOption(mLat, mLng, view);
        Marker marker = aMap.addMarker(options);
        if (!TextUtils.isEmpty(peopleId)) {
            marker.setObject(peopleId);
        }
        return marker;
    }
 
    public MarkerOptions getOption(String mLat, String mLng, View view) {
        return new MarkerOptions().anchor(0.5f, 1)
                .position(new LatLng(Double.valueOf(mLat), Double.valueOf(mLng)))
                .icon(BitmapDescriptorFactory.fromBitmap(convertViewToBitmap(view))).draggable(true).setFlat(true);
    }
 
    /**
     * 吧iew转化为bitmap
     *
     * @param view
     * @return
     */
    public static Bitmap convertViewToBitmap(View view) {
        view.setDrawingCacheEnabled(true);
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.buildDrawingCache();
        Bitmap mCacheBitmap = view.getDrawingCache();
        Bitmap mBitmap = Bitmap.createBitmap(mCacheBitmap);
        return mBitmap;
    }
 
    private void init(Bundle savedInstanceState, MapView mapView) {
        mapView.onCreate(savedInstanceState);
        this.mapView = mapView;
        aMap = mapView.getMap();
        mMyLocationStyle = new MyLocationStyle();
        mMyLocationStyle.interval(5000);
        mMyLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
        mMyLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.gps_point));
        aMap.setMyLocationStyle(mMyLocationStyle);
        aMap.setInfoWindowAdapter(this);
        aMap.setMyLocationEnabled(true);
        aMap.setOnMyLocationChangeListener(this);
        aMap.setOnMapClickListener(this);
        aMap.setOnMarkerClickListener(this);
//        aMap.setLocationSource(this);
        aMap.setOnPOIClickListener(this);
        aMap.animateCamera(CameraUpdateFactory.zoomTo(aMap.getMaxZoomLevel() - 3));
        // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
        aMap.setMyLocationEnabled(true);
        // 设置定位的类型为定位模式,有定位、跟随或地图根据面向方向旋转几种
        aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
        UiSettings uiSettings = aMap.getUiSettings();
        uiSettings.setZoomControlsEnabled(false);
    }
 
    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }
 
    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }
 
    @Override
    public void onMyLocationChange(Location location) {
 
    }
 
    @Override
    public void onMapClick(LatLng latLng) {
 
    }
 
    @Override
    public boolean onMarkerClick(Marker marker) {
        return false;
    }
 
    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
 
    }
 
    @Override
    public void deactivate() {
 
    }
 
    @Override
    public void onPOIClick(Poi poi) {
 
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
 
    /**
     * 移动相机到某个位置
     */
    public void moveCamera(String lat, String lng) {
        CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
                new CameraPosition(new LatLng(Double.valueOf(lat), Double.valueOf(lng)), 16f, 0f, 0f));
        aMap.moveCamera(mCameraUpdate);
    }
 
    public AMapLocationClient mlocationClient = null; //定位
    public AMapLocationClientOption mLocationOption = null;//定位
 
    public void initLocation() {
        //初始化定位
        mlocationClient = new AMapLocationClient(context);
        //初始化定位参数
        mLocationOption = new AMapLocationClientOption();
        //设置定位回调监听
        mlocationClient.setLocationListener(this);
        //设置为高精度定位模式
        mLocationOption.setNeedAddress(true);
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //设置定位参数
        mlocationClient.setLocationOption(mLocationOption);
        // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
        // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
        // 在定位结束后,在合适的生命周期调用onDestroy()方法
        // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
        mlocationClient.startLocation();//启动定位
    }
 
    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
 
    }
}