package com.lqr.wechat.ui.activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.RelativeLayout; import com.lqr.recyclerview.LQRRecyclerView; import com.lqr.wechat.R; import com.lqr.wechat.ui.base.BaseActivity; import com.lqr.wechat.ui.presenter.MyLocationAtPresenter; import com.lqr.wechat.ui.view.IMyLocationAtView; import com.lqr.wechat.util.LogUtils; import com.lqr.wechat.util.UIUtils; import com.tencent.lbssearch.TencentSearch; import com.tencent.lbssearch.httpresponse.BaseObject; import com.tencent.lbssearch.httpresponse.HttpResponseListener; import com.tencent.lbssearch.object.Location; import com.tencent.lbssearch.object.param.Geo2AddressParam; import com.tencent.lbssearch.object.result.Geo2AddressResultObject; import com.tencent.map.geolocation.TencentLocation; import com.tencent.map.geolocation.TencentLocationListener; import com.tencent.map.geolocation.TencentLocationManager; import com.tencent.map.geolocation.TencentLocationRequest; import com.tencent.mapsdk.raster.model.BitmapDescriptorFactory; import com.tencent.mapsdk.raster.model.CameraPosition; import com.tencent.mapsdk.raster.model.Circle; import com.tencent.mapsdk.raster.model.CircleOptions; import com.tencent.mapsdk.raster.model.LatLng; import com.tencent.mapsdk.raster.model.Marker; import com.tencent.mapsdk.raster.model.MarkerOptions; import com.tencent.tencentmap.mapsdk.map.MapView; import com.tencent.tencentmap.mapsdk.map.TencentMap; import com.zhy.autolayout.AutoLinearLayout; import butterknife.Bind; /** * @创建者 CSDN_LQR * @描述 */ public class MyLocationActivity extends BaseActivity<IMyLocationAtView, MyLocationAtPresenter> implements IMyLocationAtView, TencentLocationListener, SensorEventListener { int maxHeight = UIUtils.dip2Px(300); int minHeight = UIUtils.dip2Px(150); private SensorManager mSensorManager; private Sensor mOritationSensor; private TencentLocationManager mLocationManager; private TencentLocationRequest mLocationRequest; private TencentMap mTencentMap; private Marker myLocation; private Circle accuracy; private TencentSearch mTencentSearch; @Bind(R.id.btnToolbarSend) Button mBtnToolbarSend; @Bind(R.id.rlMap) RelativeLayout mRlMap; @Bind(R.id.map) MapView mMap; @Bind(R.id.ibShowLocation) ImageButton mIbShowLocation; @Bind(R.id.rvPOI) LQRRecyclerView mRvPOI; @Bind(R.id.pb) ProgressBar mPb; @Override public void initView() { mBtnToolbarSend.setVisibility(View.VISIBLE); setRlMapHeight(maxHeight); mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mOritationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); mLocationManager = TencentLocationManager.getInstance(this); mLocationRequest = TencentLocationRequest.create(); mTencentMap = mMap.getMap(); mTencentSearch = new TencentSearch(this); } @Override public void initData() { requestLocationUpdate(); } @Override public void initListener() { mBtnToolbarSend.setOnClickListener(v -> mPresenter.sendLocation()); mRvPOI.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy > 0 && Math.abs(dy) > 10 && ((GridLayoutManager) mRvPOI.getLayoutManager()).findFirstCompletelyVisibleItemPosition() <= 1 && mRlMap.getHeight() == maxHeight) { LogUtils.sf("上拉缩小"); setRlMapHeight(minHeight); UIUtils.postTaskDelay(() -> mRvPOI.moveToPosition(0), 0); } else if (dy < 0 && Math.abs(dy) > 10 && ((GridLayoutManager) mRvPOI.getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 1 && mRlMap.getHeight() == minHeight) { LogUtils.sf("下拉放大"); setRlMapHeight(maxHeight); UIUtils.postTaskDelay(() -> mRvPOI.moveToPosition(0), 0); } } }); mIbShowLocation.setOnClickListener(v -> requestLocationUpdate()); // mSensorManager.registerListener(MyLocationActivity.this, mOritationSensor, SensorManager.SENSOR_DELAY_NORMAL); mTencentMap.setOnMapCameraChangeListener(new TencentMap.OnMapCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { if (myLocation != null) myLocation.setPosition(mTencentMap.getMapCenter()); } @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { if (accuracy != null) { accuracy.setCenter(mTencentMap.getMapCenter()); } search(mTencentMap.getMapCenter()); } }); } private void requestLocationUpdate() { //开启定位 int error = mLocationManager.requestLocationUpdates(mLocationRequest, MyLocationActivity.this); switch (error) { case 0: LogUtils.sf("成功注册监听器"); break; case 1: LogUtils.sf("设备缺少使用腾讯定位服务需要的基本条件"); break; case 2: LogUtils.sf("manifest 中配置的 key 不正确"); break; case 3: LogUtils.sf("自动加载libtencentloc.so失败"); break; } } private void setRlMapHeight(int height) { AutoLinearLayout.LayoutParams params = (AutoLinearLayout.LayoutParams) mRlMap.getLayoutParams(); params.height = height; mRlMap.setLayoutParams(params); } @Override protected MyLocationAtPresenter createPresenter() { return new MyLocationAtPresenter(this); } @Override protected int provideContentViewId() { return R.layout.activity_my_location; } @Override public void onLocationChanged(TencentLocation tencentLocation, int i, String s) { if (i == tencentLocation.ERROR_OK) { LatLng latLng = new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude()); if (myLocation == null) { myLocation = mTencentMap.addMarker(new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromResource(R.mipmap.arm)).anchor(0.5f, 0.8f)); } if (accuracy == null) { accuracy = mTencentMap.addCircle(new CircleOptions().center(latLng).radius(tencentLocation.getAccuracy()).fillColor(0x440000ff).strokeWidth(0f)); } myLocation.setPosition(latLng); accuracy.setCenter(latLng); accuracy.setRadius(tencentLocation.getAccuracy()); mTencentMap.animateTo(latLng); mTencentMap.setZoom(16); search(latLng); //取消定位 mLocationManager.removeUpdates(MyLocationActivity.this); } else { LogUtils.sf("location failed:" + i); } } @Override public void onStatusUpdate(String s, int i, String s1) { String desc = ""; switch (i) { case STATUS_DENIED: desc = "权限被禁止"; break; case STATUS_DISABLED: desc = "模块关闭"; break; case STATUS_ENABLED: desc = "模块开启"; break; case STATUS_GPS_AVAILABLE: desc = "GPS可用,代表GPS开关打开,且搜星定位成功"; break; case STATUS_GPS_UNAVAILABLE: desc = "GPS不可用,可能 gps 权限被禁止或无法成功搜星"; break; case STATUS_LOCATION_SWITCH_OFF: desc = "位置信息开关关闭,在android M系统中,此时禁止进行wifi扫描"; break; case STATUS_UNKNOWN: break; } LogUtils.sf("location status:" + s + ", " + s1 + " " + desc); } @Override public void onSensorChanged(SensorEvent event) { // if (myLocation != null) { // myLocation.setRotation(event.values[0]); // } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private void search(LatLng latLng) { mPb.setVisibility(View.VISIBLE); mRvPOI.setVisibility(View.GONE); Location location = new Location().lat((float) latLng.getLatitude()).lng((float) latLng.getLongitude()); //还可以传入其他坐标系的坐标,不过需要用coord_type()指明所用类型 //这里设置返回周边poi列表,可以在一定程度上满足用户获取指定坐标周边poi的需求 Geo2AddressParam geo2AddressParam = new Geo2AddressParam(). location(location).get_poi(true); mTencentSearch.geo2address(geo2AddressParam, new HttpResponseListener() { @Override public void onSuccess(int arg0, BaseObject arg1) { mPb.setVisibility(View.GONE); mRvPOI.setVisibility(View.VISIBLE); if (arg1 == null) { return; } mPresenter.loadData((Geo2AddressResultObject) arg1); } @Override public void onFailure(int arg0, String arg1, Throwable arg2) { mPb.setVisibility(View.GONE); mRvPOI.setVisibility(View.VISIBLE); } }); } @Override public LQRRecyclerView getRvPOI() { return mRvPOI; } }