android 基于高德地图的轨迹回放

前段时间公司项目有一个需求,就是需要看到设备上传之后的轨迹路线,并且可以实现回放的整个过程,功能包括路线回放、地图位置插点、回放之后的轨迹标记颜色、回放加速等功能。下面是开发的整个过程。

首先,轨迹回放是基于地图做的,我这里用的是高德地图,轨迹回放是基于高德地图3D地图开发的,2D地图好像暂时不支持。必要的就是申请高德地图的key,然后配置到自己的项目里,这一步就不说了,高德地图上这些步骤很详细,也很简单,直接跳过到开发轨迹回放这一步。

首先上一个效果图:

开始回放

轨迹地图页面

接下来是先接入地图,初始化整个地图,这一步也直接跳过吧,我最后会把整个代码贴出来,如果有需要可以自己看看,直接说轨迹回放在地图上划线的代码:

首先,新建一个存放经纬度的数组:

List<LatLng> points = new ArrayList<LatLng>();

然后把你获取到的经纬度add到数组里面

//添加经纬度至数组,添加下标,防止新数据占用老数据位置

points.add(i, new LatLng(latitude, longitude));

接下来就是用获取到的经纬度在地图上添加海量的marker点:

//添加海量marker点

MarkerOptions markerOption= new MarkerOptions();

// markerOption.position(new LatLng(aLocation.getLatitude(), aLocation.getLongitude()));

markerOption.position(new LatLng(latitude, longitude));

markerOption.visible(true);//标记可见

markerOption.icon(

BitmapDescriptorFactory.fromBitmap(BitmapFactory

.decodeResource(getResources(),

R.drawable.marker_blue)));

markerOption.anchor(0.5f, 0.5f);

Marker marker= aMap.addMarker(markerOption);

// marker.setIcon();

marker.setObject(map);// 这里可以存储用户数据

listMarker.add(marker);

然后在地图上划线,就是把points的点连接起来:

/*划线*/

private void showline() {

addPolylineInPlayGround();

Log.e("tag", points.toString());

// 获取轨迹坐标点

LatLngBounds.Builder b= LatLngBounds.builder();

for (int i= 0; i< points.size(); i++) {

b.include(points.get(i));

}

LatLngBounds bounds= b.build();

aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));

}

/*添加线条*/

private void addPolylineInPlayGround() {

List list= points;

List colorList= new ArrayList();

aMap.addPolyline(new PolylineOptions().setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.custtexture)) //setCustomTextureList(bitmapDescriptors)

.addAll(list)

.useGradient(true)

.width(18));

}

现在线已经画好的,然后就可以进行轨迹回放以及暂停,销毁,加速的这些步骤:

/*开始移动*/

public void startMove() {

final PolylineOptions options= new PolylineOptions();

State = 1;

playback = 1;

play.setVisibility(View.GONE);

Fast_forward.setVisibility(View.VISIBLE);

stop.setVisibility(View.VISIBLE);

tingzhi.setVisibility(View.VISIBLE);

// 设置滑动的图标

smoothMarker.setDescriptor(BitmapDescriptorFactory.fromResource(R.mipmap.carr));

/*//当移动Marker的当前位置不在轨迹起点,先从当前位置移动到轨迹上,再开始平滑移动            // LatLng drivePoint = points.get(0);//设置小车当前位置,可以是任意点,这里直接设置为轨迹起点            LatLng drivePoint = new LatLng(39.980521,116.351905);//设置小车当前位置,可以是任意点Pair pair = PointsUtil.calShortestDistancePoint(points, drivePoint);

points.set(pair.first, drivePoint);

List subList = points.subList(pair.first, points.size());

// 设置滑动的轨迹左边点smoothMarker.setPoints(subList);*/

//计算轨迹运行之后的距离,重新开始回放

smoothMarker.setPoints(points);//设置平滑移动的轨迹list

// 设置移动的监听事件  返回 距终点的距离  单位 米

smoothMarker.setMoveListener(new SmoothMoveMarker.MoveListener() {

@Override

public void move(final double distance) {

runOnUiThread(new Runnable() {

@Override

public void run() {

//添加快进按钮,回放速度快进一倍

if (speed == 1) {

if ((int) distance > 1500000) {

smoothMarker.setTotalDuration(500);//设置平滑移动的总时间

}

if ((int) distance < 1500000 && (int) distance > 100000) {

smoothMarker.setTotalDuration(400);//设置平滑移动的总时间

}

if ((int) distance < 100000 && (int) distance > 50000) {

smoothMarker.setTotalDuration(250);//设置平滑移动的总时间

}

if ((int) distance < 50000 && (int) distance > 10000) {

smoothMarker.setTotalDuration(150);//设置平滑移动的总时间

}

if ((int) distance < 10000) {

smoothMarker.setTotalDuration(50);//设置平滑移动的总时间

}

} else {

//正常回放速度

if ((int) distance > 1500000) {

smoothMarker.setTotalDuration(1000);//设置平滑移动的总时间

}

if ((int) distance < 1500000 && (int) distance > 100000) {

smoothMarker.setTotalDuration(800);//设置平滑移动的总时间

}

if ((int) distance < 100000 && (int) distance > 50000) {

smoothMarker.setTotalDuration(500);//设置平滑移动的总时间

}

if ((int) distance < 50000 && (int) distance > 10000) {

smoothMarker.setTotalDuration(300);//设置平滑移动的总时间

}

if ((int) distance < 10000) {

smoothMarker.setTotalDuration(100);//设置平滑移动的总时间

}

}

if ((int) distance < 1) {

play.setVisibility(View.VISIBLE);

stop.setVisibility(View.GONE);

tingzhi.setVisibility(View.VISIBLE);

Fast_forward.setVisibility(View.GONE);

}

//获取当前的移动marker点,设置地图中心坐标点

LatLng position= smoothMarker.getPosition();

aMap.moveCamera(CameraUpdateFactory.changeLatLng(position));

redpoints.add(redpoints.size(), position);

aMap.addPolyline(options.color(Color.RED) //setCustomTextureList(bitmapDescriptors)

.add(position)

.useGradient(true)

.visible(true)

.width(18));

}

});

}

});

//设置地图缩放比例

aMap.moveCamera(CameraUpdateFactory.zoomTo(17));

smoothMarker.startSmoothMove();

smoothMarker.getMarker().setVisible(true);

}

/*停止平滑移动*/

public void stopMove() {

State = 2;

playback = 2;

smoothMarker.stopMove();

LatLng position1= smoothMarker.getPosition();

//暂停之后重新开始回放,继续之前的路径

//        smoothMarker.startSmoothMove();

play.setVisibility(View.VISIBLE);

stop.setVisibility(View.GONE);

tingzhi.setVisibility(View.VISIBLE);

Fast_forward.setVisibility(View.GONE);

}

/*继续中断的轨迹回放路线*/

public void startmove() {

State = 3;

play.setVisibility(View.GONE);

stop.setVisibility(View.VISIBLE);

Fast_forward.setVisibility(View.VISIBLE);

tingzhi.setVisibility(View.VISIBLE);

smoothMarker.startSmoothMove();

}

/*停止轨迹回放*/

public void cease() {

State = 4;

playback = 3;

smoothMarker.destroy();

play.setVisibility(View.VISIBLE);

stop.setVisibility(View.GONE);

tingzhi.setVisibility(View.GONE);

Fast_forward.setVisibility(View.GONE);

aMap.clear();

points.clear();

}

正常的轨迹回放需求就是这些,如果没有任何问题的话,轨迹回放以及快进的功能已经做好了,在这里说一下我的经纬度信息是从百度鹰眼上获取到的,所以不用进行轨迹纠偏,所以这一步骤我也没有详细的研究,大概误差不会太高。要注意的一点就是给经纬度数组add数据的时候一定要添加下标,不然新的数组会添加到老数据之前,这样就会造成轨迹回放的时候会先从最后的一段路线开始,结束的时候是第一段路线,所以这里一定要注意。还有一个小小的问题就是有时候进入页面的时候路线还是有一点小问题,暂时我还没想到解决的办法,欢迎指正。下面是我整个页面的详细代码:

public class MapActivity extends Activity implements View.OnClickListener, AMap.OnMarkerClickListener {

private List points = new ArrayList();

private List redpoints = new ArrayList();

private LinearLayout infoWindowLayout, linear3;

private TextView title;

private TextView snippet;

private MapBean mapbean;

private LayoutInflater factory;

private MarkerOptions markerOption;

private MapView mapView;

private AMap aMap;

private OkHttpClient okHttpClient;

private Handler mHandler = new Handler();

private ImageView play, stop, massage, tingzhi, Fast_forward;

private SmoothMoveMarker smoothMarker;

private PopupWindow popupWindow;

private CustomPopWindow popupWindow1;

private String username, key, current_timestamp, type, number, strttime, endtime, url, sensor, Alarmtime, id;

private ImageView back;

private List list;

private String Smessage;

private ProgressDialogEx progressDlgEx;

private int State, playback;

private List listMarker = new ArrayList();

private int speed = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_map);

progressDlgEx = new ProgressDialogEx(this, mHandler);

factory = LayoutInflater.from(MapActivity.this);

play = (ImageView) this.findViewById(R.id.play);

stop = (ImageView) this.findViewById(R.id.stop);

massage = (ImageView) this.findViewById(R.id.massage);

massage.setOnClickListener(this);

back = (ImageView) this.findViewById(R.id.back);

back.setOnClickListener(this);

play = (ImageView) this.findViewById(R.id.play);

play.setOnClickListener(this);

stop = (ImageView) this.findViewById(R.id.stop);

stop.setOnClickListener(this);

tingzhi = (ImageView) this.findViewById(R.id.tingzhi);

tingzhi.setOnClickListener(this);

Fast_forward = (ImageView) this.findViewById(R.id.Fast_forward);

Fast_forward.setOnClickListener(this);

// 获取用户名

username = SharedPreferencesUtils.getString(MapActivity.this, "userName", "");

key = Data.getInstance().key;

//时间戳

current_timestamp = Data.getInstance().current_timestamp;

Intent intent= getIntent();

type = intent.getStringExtra("type");//设备类型  1冷藏车  2保温箱

number = intent.getStringExtra("number");//设备号  车牌号或保温箱号

strttime = intent.getStringExtra("strttime");//开始时间

endtime = intent.getStringExtra("endtime");//结束时间

sensor = intent.getStringExtra("sensor");//sensor

id = intent.getStringExtra("id");

mapView = (MapView) findViewById(R.id.map);

mapView.onCreate(savedInstanceState);// 此方法必须重写

init();

DeviceWorkTime();

ShowMessage();

}

/*比较时间截取,分割时间不大于24小时*/

private void CycleTime(String num, int startdate, int enddate) {

//相差6天以上

if (enddate- startdate>= 518400) {

String onetime= String.valueOf(enddate- 86399);

String twotime= String.valueOf(Integer.parseInt(onetime) - 86399);

String thretime= String.valueOf(Integer.parseInt(twotime) - 86399);

String foretime= String.valueOf(Integer.parseInt(threetime) - 86399);

String fivetime= String.valueOf(Integer.parseInt(foretime) - 86399);

String sixtime= String.valueOf(Integer.parseInt(fivetime) - 86399);

//strttime,sixtime  sixtime,fivetime  fivetime,foretime    foretime,threetime  threetime,twotime  twotime,onetime  onetime,endtime

show(num, String.valueOf(startdate), sixtime);

show(num, sixtime, fivetime);

show(num, fivetime, foretime);

show(num, foretime, threetime);

show(num, threetime, twotime);

show(num, twotime, onetime);

show(num, onetime, String.valueOf(enddate));

}

//小于1天

else if (enddate- startdate< 86400) {

show(num, String.valueOf(startdate), String.valueOf(enddate));

}

}

/*获取设备工作时间段*/

private void DeviceWorkTime() {

points.clear();

new Thread() {

@Override

public void run() {

progressDlgEx.simpleModeShowHandleThread();

OkHttpClient okHttpClient= new OkHttpClient();

String format= String.format(KeyPath.Path.head + KeyPath.Path.deviceworktime, username, key, current_timestamp, type, strttime, endtime, id);

Request build1= new Request.Builder().url(format).build();

okHttpClient.newCall(build1).enqueue(new Callback() {

@Overrid

public void onFailure(Call call, IOException e) {

}

@Override

public void onResponse(Call call, Response response) throws IOException {

String string= response.body().string();

if (string!= null) {

try {

final JSONObject jsonObject= new JSONObject(string);

int status= jsonObject.getInt("status");

if (status== 1) {

mHandler.post(new Runnable() {

@Override

public void run() {

try {

JSONObject data= jsonObject.getJSONObject("data");

JSONArray items= data.getJSONArray("device");

final List listt= JsonUtils.parseJsonArray(items);

Data.getInstance().list = listt;

for (int i= 0; i< listt.size(); i++) {

Map map= (Map) listt.get(i);

String boxmac= map.get("boxmac").toString();

int startdate= Integer.parseInt(map.get("startdate").toString());

int enddate= Integer.parseInt(map.get("enddate").toString());

CycleTime(boxmac, startdate, enddate);

}

} catch (JSONException e) {

e.printStackTrace();

}

}

});

}

} catch (JSONException e) {

e.printStackTrace();

} finally {

progressDlgEx.closeHandleThread();

}

}

}

});

}

}.start();

}

/**

* 初始化AMap对象

*/

private void init() {

if (aMap == null) {

aMap = mapView.getMap();

}

aMap.setOnMarkerClickListener(this);// 设置点击marker事件监听器

smoothMarker = new SmoothMoveMarker(aMap);

}

/**

* 方法必须重写

*/

@Override

protected void onResume() {

super.onResume();

mapView.onResume()

}

/**

* 方法必须重写

*/

@Override

protected void onPause() {

super.onPause();

mapView.onPause();

}

/**

* 方法必须重写

*/

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

mapView.onSaveInstanceState(outState);

}

/**

* 方法必须重写

*/

@Override

protected void onDestroy() {

super.onDestroy();

mapView.onDestroy();

}

/*划线*/

private void showline() {

addPolylineInPlayGround();

Log.e("tag", points.toString());

// 获取轨迹坐标点

LatLngBounds.Builder b= LatLngBounds.builder();

for (int i= 0; i< points.size(); i++) {

b.include(points.get(i));

}

LatLngBounds bounds= b.build();

aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));

}

/*开始移动*/

public void startMove() {

final PolylineOptions options= new PolylineOptions();

State = 1;

playback = 1;

play.setVisibility(View.GONE);

Fast_forward.setVisibility(View.VISIBLE);

stop.setVisibility(View.VISIBLE);

tingzhi.setVisibility(View.VISIBLE);

// 设置滑动的图标

smoothMarker.setDescriptor(BitmapDescriptorFactory.fromResource(R.mipmap.carr));

/*//当移动Marker的当前位置不在轨迹起点,先从当前位置移动到轨迹上,再开始平滑移动            // LatLng drivePoint = points.get(0);//设置小车当前位置,可以是任意点,这里直接设置为轨迹起点            LatLng drivePoint = new LatLng(39.980521,116.351905);//设置小车当前位置,可以是任意点Pair pair = PointsUtil.calShortestDistancePoint(points, drivePoint);

points.set(pair.first, drivePoint);

List subList = points.subList(pair.first, points.size());

// 设置滑动的轨迹左边点smoothMarker.setPoints(subList);*/

//计算轨迹运行之后的距离,重新开始回放

smoothMarker.setPoints(points);//设置平滑移动的轨迹list

// 设置移动的监听事件  返回 距终点的距离  单位 米

smoothMarker.setMoveListener(new SmoothMoveMarker.MoveListener() {

@Override

public void move(final double distance) {

runOnUiThread(new Runnable() {

@Override

public void run() {

//添加快进按钮,回放速度快进一倍

if (speed == 1) {

if ((int) distance > 1500000) {

smoothMarker.setTotalDuration(500);//设置平滑移动的总时间

}

if ((int) distance < 1500000 && (int) distance > 100000) {

smoothMarker.setTotalDuration(400);//设置平滑移动的总时间

}

if ((int) distance < 100000 && (int) distance > 50000) {

smoothMarker.setTotalDuration(250);//设置平滑移动的总时间

}

if ((int) distance < 50000 && (int) distance > 10000) {

smoothMarker.setTotalDuration(150);//设置平滑移动的总时间

}

if ((int) distance < 10000) {

smoothMarker.setTotalDuration(50);//设置平滑移动的总时间

}

} else {

//正常回放速度

if ((int) distance > 1500000) {

smoothMarker.setTotalDuration(1000);//设置平滑移动的总时间

}

if ((int) distance < 1500000 && (int) distance > 100000) {

smoothMarker.setTotalDuration(800);//设置平滑移动的总时间

}

if ((int) distance < 100000 && (int) distance > 50000) {

smoothMarker.setTotalDuration(500);//设置平滑移动的总时间

}

if ((int) distance < 50000 && (int) distance > 10000) {

smoothMarker.setTotalDuration(300);//设置平滑移动的总时间

}

if ((int) distance < 10000) {

smoothMarker.setTotalDuration(100);//设置平滑移动的总时间

}

}

if ((int) distance < 1) {

play.setVisibility(View.VISIBLE);

stop.setVisibility(View.GONE);

tingzhi.setVisibility(View.VISIBLE);

Fast_forward.setVisibility(View.GONE);

//                                aMap.clear();

//                                points.clear();

//                                options.addAll(redpoints);

//                                showline();

//                                DeviceWorkTime();

}

//获取当前的移动marker点,设置地图中心坐标点

LatLng position= smoothMarker.getPosition();

aMap.moveCamera(CameraUpdateFactory.changeLatLng(position));

redpoints.add(redpoints.size(), position);

//                            options.addAll(redpoints);

//                            options.add(position);

//                            options.width(18);

//                            options.useGradient(true);

//                            options.color(Color.RED);

//                            aMap.addPolyline(options);

aMap.addPolyline(options.color(Color.RED) //setCustomTextureList(bitmapDescriptors)

.add(position)

.useGradient(true)

.visible(true)

.width(18));

}

});

}

});

//设置地图缩放比例

aMap.moveCamera(CameraUpdateFactory.zoomTo(17));

smoothMarker.startSmoothMove();

smoothMarker.getMarker().setVisible(true);

}

/*停止平滑移动*/

public void stopMove() {

State = 2;

playback = 2;

smoothMarker.stopMove();

LatLng position1= smoothMarker.getPosition();

//暂停之后重新开始回放,继续之前的路径

//        smoothMarker.startSmoothMove();

play.setVisibility(View.VISIBLE);

stop.setVisibility(View.GONE);

tingzhi.setVisibility(View.VISIBLE);

Fast_forward.setVisibility(View.GONE);

}

/*继续中断的轨迹回放路线*/

public void startmove() {

State = 3;

play.setVisibility(View.GONE);

stop.setVisibility(View.VISIBLE);

Fast_forward.setVisibility(View.VISIBLE);

tingzhi.setVisibility(View.VISIBLE);

smoothMarker.startSmoothMove();

}

/*停止轨迹回放*/

public void cease() {

State = 4;

playback = 3;

smoothMarker.destroy();

play.setVisibility(View.VISIBLE);

stop.setVisibility(View.GONE);

tingzhi.setVisibility(View.GONE);

Fast_forward.setVisibility(View.GONE);

aMap.clear();

points.clear();

DeviceWorkTime();

//        List colorList = new ArrayList();

//        aMap.addPolyline(options.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.custtexture)) //setCustomTextureList(bitmapDescriptors)

//                .addAll(points)

//                .useGradient(true)

//                .width(18));

}

/*添加线条*/

private void addPolylineInPlayGround() {

List list= points;

List colorList= new ArrayList();

aMap.addPolyline(new PolylineOptions().setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.custtexture)) //setCustomTextureList(bitmapDescriptors)

.addAll(list)

.useGradient(true)

.width(18));

}

/*百度鹰眼接口返回经纬度数据*/

public void show(final String num, final String strttime, final String endtime) {

new Thread() {

@Override

public void run() {

progressDlgEx.simpleModeShowHandleThread();

OkHttpClient okHttpClient= new OkHttpClient();

//这里是百度鹰眼的接口,为了不造成麻烦,我就不发出去了

Request build1= new Request.Builder().url(format).build();

okHttpClient.newCall(build1).enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

}

@Override

public void onResponse(Call call, Response response) throws IOException {

String string= response.body().string();

if (string!= null) {

try {

final JSONObject jsonObject= new JSONObject(string);

int status= jsonObject.getInt("status");

if (status== 0) {

mHandler.post(new Runnable() {

@Override

public void run() {

try {

JSONArray pointss= jsonObject.getJSONArray("points");

final List listt= JsonUtils.parseJsonArray(pointss);

for (int i= 0; i< listt.size(); i++) {

Map map= (Map) listt.get(i);

final double latitude= Double.parseDouble(map.get("latitude").toString());

final double longitude= Double.parseDouble(map.get("longitude").toString());

final String address= map.get("address").toString();

final int loc_time= Integer.parseInt(map.get("loc_time").toString());

//

//添加经纬度至数组,添加下标,防止新数据占用老数据位置

points.add(i, new LatLng(latitude, longitude));

//添加海量marker点

MarkerOptions markerOption= new MarkerOptions();

// markerOption.position(new LatLng(aLocation.getLatitude(), aLocation.getLongitude()));

markerOption.position(new LatLng(latitude, longitude));

markerOption.visible(true);//标记可见

markerOption.icon(

BitmapDescriptorFactory.fromBitmap(BitmapFactory

.decodeResource(getResources(),

R.drawable.marker_blue)));

markerOption.anchor(0.5f, 0.5f);

Marker marker= aMap.addMarker(markerOption);

// marker.setIcon();

marker.setObject(map);// 这里可以存储用户数据

listMarker.add(marker);

}

showline();

} catch (JSONException e) {

e.printStackTrace();

}

}

});

}

} catch (JSONException e) {

e.printStackTrace();

} finally {

progressDlgEx.closeHandleThread();

}

}

}

});

}

}.start();

}

/**

* 点击Marker

*/

public boolean onMarkerClick(Marker arg0) {

// TODO Auto-generated method stub

// String streenName = "中山路";

Map map= (Map) arg0.getObject();

final double latitude= Double.parseDouble(map.get("latitude").toString());

final double longitude= Double.parseDouble(map.get("longitude").toString());

final String address= map.get("address").toString();

final int loc_time= Integer.parseInt(map.get("loc_time").toString());

//        arg0.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.purple_pin));

arg0.setTitle("详细信息");

ShowSensor(String.valueOf(loc_time), latitude, longitude, address);

return false;

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.Fast_forward:

DialogUtils.showPopMsgInHandleThread(MapActivity.this, mHandler, "快进一倍回放!");

Fast_forward.setVisibility(View.GONE);

speed = 1;

break;

case R.id.back:

finish();

points.clear();

break;

case R.id.play:

if (points.size() < 1) {

Toast.makeText(MapActivity.this, MapActivity.this.getString(R.string.zwjl), Toast.LENGTH_SHORT).show();

} else {

if (playback == 1) {

DialogUtils.showPopMsgInHandleThread(MapActivity.this, mHandler, "请先停止轨迹回放路线!");

return;

} else {

DialogUtils.showPopMsgInHandleThread(MapActivity.this, mHandler, "开始回放轨迹路线!");

speed = 0;

if (State == 2) {

startmove();

} else {

startMove();

}

}

}

break;

case R.id.stop:

DialogUtils.showPopMsgInHandleThread(MapActivity.this, mHandler, "暂停轨迹回放!");

speed = 0;

stopMove();

break;

case R.id.tingzhi:

DialogUtils.showPopMsgInHandleThread(MapActivity.this, mHandler, "停止轨迹回放!");

cease();

break;

case R.id.massage:

if (points.size() < 1) {

Toast.makeText(MapActivity.this, MapActivity.this.getString(R.string.zwjl), Toast.LENGTH_SHORT).show();

} else {

if (popupWindow != null && popupWindow.isShowing()) {

return;

}

LinearLayout layout= (LinearLayout) getLayoutInflater().inflate(R.layout.map_pop, null);

popupWindow = new PopupWindow(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

//点击空白处时,隐藏掉pop窗口

popupWindow.setFocusable(true);

popupWindow.setBackgroundDrawable(new BitmapDrawable());

//添加弹出、弹入的动画

popupWindow.setAnimationStyle(R.style.Popupwindow);

int[] location= new int[2];

massage.getLocationOnScreen(location);

popupWindow.showAtLocation(massage, Gravity.CENTER | Gravity.BOTTOM, 0, -location[1]);

//添加按键事件监听

//setButtonListeners(layout);

//添加pop窗口关闭事件,主要是实现关闭时改变背景的透明度

//popupWindow.setOnDismissListener(new poponDismissListener());

//backgroundAlpha(1f);

linear3 = (LinearLayout) layout.findViewById(R.id.linear3);

for (int i= 0; i< Data.getInstance().list.size(); i++) {

Map map= (Map) Data.getInstance().list.get(i);

String boxmac= map.get("boxmac").toString();

int startdate= Integer.parseInt(map.get("startdate").toString());

int enddate= Integer.parseInt(map.get("enddate").toString());

SplitTime(boxmac, startdate, enddate);

Log.e("TAG", boxmac+ startdate+ enddate);

}

}

break;

default:

break;

}

}

}

android 基于高德地图的轨迹回放相关推荐

  1. 高德地图3D轨迹回放 + 视野跟随功能

    高德地图3D轨迹回放 + 视野跟随功能 概述 代码实现步骤 完整代码 (需要添加一个2.0的key) 概述 若有帮助到你,麻烦点一波关注,博主会持续推出Echarts,D3,地图,Three.js方面 ...

  2. Android基于高德地图实现多人实时共享位置

    自开发上一款智慧旅游产品后,发现一个很有意义而且很实用的功能,就是模仿微信的位置共享,可以看到对方的位置,一直想模仿做出这样的效果.最近闲下来之后终于实现了.下面就把我的实现过程和心得分享给大家. 步 ...

  3. Android使用高德地图实现轨迹播放和进度条控制

    轨迹播放 首先上视频效果(本来是要弄成GIF动态图的,但是手机将图片用微信发到电脑,电脑修改后缀名后还是不能展示) 在实现前需要先初始化和定义一些变量(大佬可以直接跳过),坐标列表和起点以及终点坐标根 ...

  4. Android 基于高德地图的锁屏后定位和轨迹自动纠偏(离线版)

    目录 一.后台如何持续获取定位 1.后台以及锁屏后持续定位异常的原因以及应对方案探索 2.后台持续获取定位失败的应对方案 二.对坐标点进行加工处理 (1).为什么要加工处理 (2).如何加工处理 本文 ...

  5. H5移动端 高德地图 巡查轨迹回放 2.0版

    注意是HTTPS还是HTTP index.html引入 <script type="text/javascript" src="http://webapi.amap ...

  6. Android基于高德地图实时定位服务

    Service功能有:实时定位(后台进行) Service不会,去百度谷歌 功能有 实时定位(30秒间隔) 判断是否在规定的时间段内 判断距离是否大于规定的距离 判断服务是否在开启的状态 服务代码:L ...

  7. 只用一个marker 替换 高德_Android基于高德地图完全自定义Marker的实现方法

    前言 相信做地图社交类APP开发的大家都知道,一般情况下,为了整体的美观和用户体验度,我们需要定制化Marker的样式.本文中实现的方式都是基于高德地图的,百度地图也类似,大家可以照葫芦画瓢,废话不多 ...

  8. 高德地图轨迹PHP,高德地图JSAPI轨迹重复绘制

    介绍一个基于高德地图JSAPI轨迹展示案例: 说明: 1.定时接口取数据刷新轨迹: 2.轨迹坐标数量较大: 3.轨迹点位信息需要展示,如时间.速度.多少点位: 4.避免地图重新渲染,只刷新坐标: 使用 ...

  9. Android实现高德地图轨迹回放

    Android实现高德地图轨迹回放 写在前面 准备 官方文档解读 创建应用: 地图api引入: 权限添加 效果展示 过程实现 地图初始化 定位 显示标记点 点平滑移动 添加呼吸点 写在结尾 写在前面 ...

最新文章

  1. Redhat7开机图形或文字界面
  2. 1046 Shortest Distance (20 分)【难度: 简单 / 知识点: 前缀和 / 破环成链】
  3. QML基础类型之double
  4. shell实现简单的进程监控脚本
  5. python中import os_python import osgeo.gdal出错
  6. python 编码声明位置,python中的编码声明
  7. Windows子系统安装图形界面
  8. 小米高通9008授权MiFlash刷机免认证思路
  9. 玩转硬件|6种修复U盘损坏的方法教程介绍,快去试试吧
  10. 光盘出租系统mysql_数据库课程设计--碟片出租系统
  11. 【观察】华为云:决胜拉美市场“正当时”,做出海企业的“好帮手”
  12. n行数字组成的数字三角形详解
  13. Python Plotly制作网页版表格
  14. Parental Hopes and Personal Ideals
  15. 掌门1对1《啊呜!卡通人》引强烈共鸣 智能科技赋能高效教学收获点赞
  16. DataGrid自动调整行高
  17. 动态爱心代码(pathon html)
  18. 物联网通信协议-MQTT及使用python实现
  19. 做的一个wmp11播放器的LOGO
  20. 【网络仿真】ns-3基础(上)

热门文章

  1. Android学习笔记之百度地图(根据地名查询经纬度)
  2. sql 存储过程回滚用法
  3. 检测到磁盘可能为uefi引导_如何用uefi引导安装win7
  4. Synology Drive Client首次安装登录,提示:用户名/密码无效或用户权限不足
  5. 惠普HP Color LaserJet Enterprise M751dn 驱动
  6. 07-字体及文本样式
  7. 2022年东南大学计算机考研复试分数线
  8. 黑马程序员 学习日记(二)
  9. Unreal4 学习资源合集
  10. pyautogui 滑动页面_PyAutoGUI使用