您的位置:首页 > 其它

百度地图 历史轨迹播放

2017-12-20 14:50 344 查看
package com.qiancheng.carsmangersystem.ui.fragment;

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.widget.AppCompatSeekBar;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RadioButton;
import android.widget.TextView;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.qiancheng.carsmangersystem.R;
import com.qiancheng.carsmangersystem.base.LazyLoadFragment;
import com.qiancheng.carsmangersystem.bean.HistoryLineBean;
import com.qiancheng.carsmangersystem.util.DateUtil;
import com.qiancheng.carsmangersystem.util.Preferences;
import com.umeng.analytics.MobclickAgent;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
* Created by pc on 2017/10/9.
*/

public class MapFragment extends LazyLoadFragment {
@BindView(R.id.mapView)
MapView mMapView;
@BindView(R.id.img_play_pause)
ImageView imgPlayPause;
@BindView(R.id.img_stop)
ImageView imgStop;
@BindView(R.id.seekBar)
AppCompatSeekBar mSeekBar;
@BindView(R.id.img_setting)
ImageView imgSetting;
@BindView(R.id.ll_play)
LinearLayout llPlay;
@BindView(R.id.ll_point)
LinearLayout llPoint;
Unbinder unbinder;
<
21fb0
span style="color:#a082bd;">@BindView(R.id.tv_point_time)
TextView tvPointTime;
@BindView(R.id.tv_point_speed)
TextView tvPointSpeed;
@BindView(R.id.tv_point_address)
TextView tvPointAddress;
@BindView(R.id.tv_point_all_mile)
TextView tvPointAllMile;
@BindView(R.id.tv_map_state)
TextView tvMapState;

private BaiduMap mBaiduMap;
private Polyline mPolyline;
private Marker mMoveMarker;//移动图标
private Handler mHandler;
private MyThread thread;//小车移动线程
private PopupWindow popupWindow;
private int time_interval = 500;// 通过设置间隔时间和距离可以控制速度和图标移动的距离
private List<HistoryLineBean.ListBean> listBeen;
private boolean isStop = false;//是否复位

@Override
public int initLayout() {
return R.layout.fragment_map;
}

@Override
public void initViews(View view) {
unbinder = ButterKnife.bind(this, view);
}

@Override
public void loadData() {
mMapView.onCreate(getActivity(), bundle);
mSeekBar.setEnabled(false);
listBeen = DateUtil.getInstance().getLineBean().getList();
mBaiduMap = mMapView.getMap();
mMapView.showZoomControls(false);//是否显示缩小放大按钮
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(new LatLng(Double.valueOf(listBeen.get(0).getBlat()), Double.valueOf(listBeen.get(0).getBlng()))).zoom(16);
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
mHandler = new Handler(Looper.getMainLooper());
drawPolyLine();
thread = new MyThread();
thread.start();
setListener();
Preferences.saveInt("checkedIndex", 1);
if (Preferences.getBoolean("Satellite", false)) {
tvMapState.setText("卫星");
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
} else {
tvMapState.setText("普通");
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
}
}

//设置监听
private void setListener() {
//解决Viewpager与mapView 的事件冲突
mMapView.getChildAt(0).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
mMapView.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mMapView.requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
//播放 暂停
imgPlayPause.setOnClickListener(view -> {
if (llPoint.getVisibility() == View.GONE)
llPoint.setVisibility(View.VISIBLE);

if (thread.isBreak) {
imgPlayPause.setSelected(true);
thread.setBreak(false);
thread.setAllBreak(false);
if (isStop) {
thread.setAllBreak(true);
isStop = false;
}
} else {
imgPlayPause.setSelected(false);
thread.setBreak(true);
}
});
//停止  复位数据
imgStop.setOnClickListener(view -> {
handler.sendEmptyMessage(1);
});
//设置
imgSetting.setOnClickListener(view -> {
if (popupWindow == null) initPopupWindow();
//获取点击View的坐标
int[] location = new int[2];
llPlay.getLocationOnScreen(location);
//        popupWindow.showAsDropDown(v);//在v的下面
//显示在上方
//        popupWindow.showAtLocation(v,Gravity.NO_GRAVITY,location[0]+v.getWidth()/2,location[1]-measuredHeight);
//        //显示在正上方
//            popupWindow.showAtLocation(llPlay, Gravity.NO_GRAVITY, location[0] - measuredWidth / 2 - 5, location[1] - measuredHeight);
popupWindow.showAtLocation(llPlay, Gravity.NO_GRAVITY, (location[0] + llPlay.getWidth()) - measuredWidth, location[1] - measuredHeight);
//        //显示在左方
//        popupWindow.showAtLocation(v,Gravity.NO_GRAVITY,location[0]-popupWindow.getWidth(),location[1]);
//        //显示在下方
//        popupWindow.showAtLocation(v,Gravity.NO_GRAVITY,location[0]+v.getWidth(),location[1]);
//        popupWindow.setAnimationStyle(android.R.style.Animation_Translucent);//设置动画
});
//地图状态
tvMapState.setOnClickListener(view -> {
if (Preferences.getBoolean("Satellite", false)) {
tvMapState.setText("标准");
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
Preferences.saveBoolean("Satellite", false);
} else {
tvMapState.setText("卫星");
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
Preferences.saveBoolean("Satellite", true);
}
});
}

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {//开始
imgPlayPause.setSelected(false);
setPoint(0);
mSeekBar.setProgress(0);
thread = new MyThread();
thread.start();
} else {//复位
if (mSeekBar.getProgress() == 0) return;
imgPlayPause.setSelected(false);
setPoint(0);
mSeekBar.setProgress(0);
thread.setBreak(true);
thread.clearPolyLines();
isStop = true;
}
llPoint.setVisibility(View.GONE);
mBaiduMap.clear();
drawPolyLine();
}
};

int measuredWidth;
int measuredHeight;
//请自动忽略
public void initPopupWindow() {
View view = View.inflate(getActivity(), R.layout.popup_history_setting, null);
RadioButton rdbSpeed0ne = view.findViewById(R.id.rdb_speed_one);
RadioButton rdbSpeedTwo = view.findViewById(R.id.rdb_speed_two);
RadioButton rdbSpeedThree = view.findViewById(R.id.rdb_speed_three);

//获取PopupWindow中View的宽高
view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
measuredWidth = view.getMeasuredWidth();
measuredHeight = view.getMeasuredHeight();

popupWindow = new PopupWindow(view, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);//popupwindow设置焦点
popupWindow.setBackgroundDrawable(new ColorDrawable(0xaa000000));//设置背景
popupWindow.setOutsideTouchable(true);//点击外面窗口消失
int index = Preferences.getInt("checkedIndex", 1);
if (index == 1) rdbSpeed0ne.setChecked(true);
if (index == 2) rdbSpeedTwo.setChecked(true);
if (index == 3) rdbSpeedThree.setChecked(true);
rdbSpeed0ne.setOnClickListener(listener);
rdbSpeedTwo.setOnClickListener(listener);
rdbSpeedThree.setOnClickListener(listener);
}
//控制移动速度
View.OnClickListener listener = view -> {
switch (view.getId()) {
case R.id.rdb_speed_one:
time_interval = 500;
Preferences.saveInt("checkedIndex", 1);
break;
case R.id.rdb_speed_two:
time_interval = 300;
Preferences.saveInt("checkedIndex", 2);
break;
case R.id.rdb_speed_three:
time_interval = 100;
Preferences.saveInt("checkedIndex", 3);
break;
}
popupWindow.dismiss();
};

//停止时返回起点
private void setPoint(int index) {
final LatLng startPoint = new LatLng(Double.valueOf(listBeen.get(index).getBlat()), Double.valueOf(listBeen.get(index).getBlng()));
final LatLng endPoint = new LatLng(Double.valueOf(listBeen.get(index + 1).getBlat()), Double.valueOf(listBeen.get(index + 1).getBlng()));
mMoveMarker.setPosition(startPoint);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().target(startPoint).build()));
mHandler.post(() -> {
if (mMapView == null) {
return;
}
mMoveMarker.setRotate((float) getAngle(startPoint, endPoint));
});
}

private void drawPolyLine() {

List<LatLng> polylines = new ArrayList<>();
int length = listBeen.size();
for (int index = 0; index < length; index++) {
polylines.add(new LatLng(Double.valueOf(listBeen.get(index).getBlat()), Double.valueOf(listBeen.get(index).getBlng())));
}

PolylineOptions polylineOptions = new PolylineOptions().points(polylines).width(6).color(Color.RED);

mPolyline = (Polyline) mBaiduMap.addOverlay(polylineOptions);
OverlayOptions markerOptions;
markerOptions = new MarkerOptions().flat(true).anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.arrow)).position(polylines.get(0))
.rotate((float) getAngle(0));
mMoveMarker = (Marker) mBaiduMap.addOverlay(markerOptions);

mSeekBar.setMax(listBeen.size());
setStartEndState(Double.valueOf(listBeen.get(0).getBlat()), Double.valueOf(listBeen.get(0).getBlng()), R.mipmap.ic_start_point);
setStartEndState(Double.valueOf(listBeen.get(length - 1).getBlat()), Double.valueOf(listBeen.get(length - 1).getBlng()), R.mipmap.ic_end_point);
}

//设置起点和终点
private void setStartEndState(double lat, double lng, int markResource) {
//定义Maker坐标点
LatLng point = new LatLng(lat, lng);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(markResource);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
}

/**
* 根据点获取图标转的角度
*/
private double getAngle(int startIndex) {
if ((startIndex + 1) >= mPolyline.getPoints().size()) {
throw new RuntimeException("index out of bonds");
}
LatLng startPoint = mPolyline.getPoints().get(startIndex);
LatLng endPoint = mPolyline.getPoints().get(startIndex + 1);
return getAngle(startPoint, endPoint);
}

/**
* 根据两点算取图标转的角度
*/
private double getAngle(LatLng fromPoint, LatLng toPoint) {
double slope = getSlope(fromPoint, toPoint);
if (slope == Double.MAX_VALUE) {
if (toPoint.latitude > fromPoint.latitude) {
return 0;
} else {
return 180;
}
}
float deltAngle = 0;
if ((toPoint.latitude - fromPoint.latitude) * slope < 0) {
deltAngle = 180;
}
double radio = Math.atan(slope);
double angle = 180 * (radio / Math.PI) + deltAngle - 90;
return angle;
}

/**
* 算斜率
*/
private double getSlope(LatLng fromPoint, LatLng toPoint) {
if (toPoint.longitude == fromPoint.longitude) {
return Double.MAX_VALUE;
}
double slope = ((toPoint.latitude - fromPoint.latitude) / (toPoint.longitude - fromPoint.longitude));
return slope;

}

@Override
public void onResume() {
super.onResume();
mMapView.onResume();
MobclickAgent.onPageStart("MapFragment");
}

@Override
public void onPause() {
super.onPause();
mMapView.onPause();
MobclickAgent.onPageEnd("MapFragment");
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}

@Override
public void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
mBaiduMap.clear();
if (thread != null)
thread.interrupt();
thread = null;
unbinder.unbind();
}

//小车移动轨迹线程
private class MyThread extends Thread {

List<LatLng> polyLines = new ArrayList<>();
private boolean isBreak = true;
private boolean isAllBreak = false;

public void setAllBreak(boolean allBreak) {
isAllBreak = allBreak;
}

public void setBreak(boolean aBreak) {
isBreak = aBreak;
}

public void clearPolyLines() {
polyLines.clear();
}

@Override
public void run() {
polyLines.clear();
for (int i = 0; i < listBeen.size() - 1; i++) {
while (isBreak) {
try {//暂停时线程休息
Thread.sleep(200);
} catch (InterruptedException e) {
}
}
if (isAllBreak) {
i = 0;
isAllBreak = false;
}
if (mSeekBar == null) return;
mSeekBar.setProgress(i);
final LatLng startPoint = new LatLng(Double.valueOf(listBeen.get(i).getBlat()), Double.valueOf(listBeen.get(i).getBlng()));
final LatLng endPoint = new LatLng(Double.valueOf(listBeen.get(i + 1).getBlat()), Double.valueOf(listBeen.get(i + 1).getBlng()));
polyLines.add(startPoint);
if (polyLines.size() > 1) {
PolylineOptions polylineOptions = new PolylineOptions().points(polyLines).width(6).color(Color.GRAY);
mMoveMarker.setPosition(startPoint);
mBaiduMap.addOverlay(polylineOptions);
}

mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().target(startPoint).build()));
int finalI = i;
mHandler.post(() -> {
if (mMapView == null) {
return;
}
tvPointTime.setText(listBeen.get(finalI).getTime());
tvPointSpeed.setText(listBeen.get(finalI).getSpeed() + " km/h , " + listBeen.get(finalI).getDrctCn());
tvPointAllMile.setText(listBeen.get(finalI).getMile() + " km");
tvPointAddress.setText(listBeen.get(finalI).getAddr());
mMoveMarker.setRotate((float) getAngle(startPoint, endPoint));//移动真相,动画

});

try {
Thread.sleep(time_interval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(0);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息