package xyz.facex.imitaterunning; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.util.Pair; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.MapView; import com.amap.api.maps.model.BitmapDescriptor; import com.amap.api.maps.model.BitmapDescriptorFactory; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.amap.api.maps.model.PolylineOptions; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Author: www.facex.xyz */ public class MainActivity extends Activity { private MapView mapView; private AMap aMap; private SmoothMarker smoothMarker; private float speed = 8; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 init(); } /** * 初始化AMap对象 */ private void init() { if (aMap == null) { aMap = mapView.getMap(); } } /** * 方法必须重写 */ @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(); } public void move(View view) { addPolylineInPlayGround(); List<LatLng> points = readLatLngs(); 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)); smoothMarker = new SmoothMarker(aMap); smoothMarker.setDescriptor(BitmapDescriptorFactory.fromResource(R.drawable.car)); LatLng drivePoint = points.get(0); Pair<Integer, LatLng> pair = PointsUtil.calShortestDistancePoint(points, drivePoint); points.set(pair.first, drivePoint); List<LatLng> subList = points.subList(pair.first, points.size()); smoothMarker.setPoints(subList); smoothMarker.setSpeed(20); aMap.setInfoWindowAdapter(infoWindowAdapter); smoothMarker.setMoveListener(new SmoothMarker.SmoothMarkerMoveListener() { @Override public void move(double remainDistance, double totalDistance) { if (infoWindowLayout != null && title != null) { title.setText("距离终点还有: " + (int) remainDistance + "米\n" + "完成百分比:" + (int) ((totalDistance - remainDistance) / totalDistance * 100) + "%"); } } @Override public void stop() { Toast.makeText(MainActivity.this, "动画停止", Toast.LENGTH_SHORT).show(); Log.d("MainActivity", smoothMarker.getPosition().toString()); } }); smoothMarker.getMarker().showInfoWindow(); smoothMarker.startSmoothMove(); } public void pause(View view) { smoothMarker.pauseMove(); } public void resume(View view) { smoothMarker.resumeMove(); } public void accelerate(View view) { speed += 8; smoothMarker.changeSpeed(speed); } AMap.InfoWindowAdapter infoWindowAdapter = new AMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return getInfoWindowView(marker); } @Override public View getInfoContents(Marker marker) { return getInfoWindowView(marker); } }; LinearLayout infoWindowLayout; TextView title; TextView snippet; private View getInfoWindowView(Marker marker) { if (infoWindowLayout == null) { infoWindowLayout = new LinearLayout(MainActivity.this); infoWindowLayout.setOrientation(LinearLayout.VERTICAL); title = new TextView(MainActivity.this); snippet = new TextView(MainActivity.this); title.setTextColor(Color.BLACK); snippet.setTextColor(Color.BLACK); infoWindowLayout.setBackgroundResource(R.drawable.infowindow_bg); infoWindowLayout.addView(title); infoWindowLayout.addView(snippet); } return infoWindowLayout; } private void addPolylineInPlayGround() { List<LatLng> list = readLatLngs(); List<Integer> colorList = new ArrayList<Integer>(); List<BitmapDescriptor> bitmapDescriptors = new ArrayList<BitmapDescriptor>(); int[] colors = new int[]{Color.argb(255, 0, 255, 0), Color.argb(255, 255, 255, 0), Color .argb(255, 255, 0, 0)}; //用一个数组来存放纹理 List<BitmapDescriptor> textureList = new ArrayList<BitmapDescriptor>(); textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.custtexture)); List<Integer> texIndexList = new ArrayList<Integer>(); texIndexList.add(0);//对应上面的第0个纹理 texIndexList.add(1); texIndexList.add(2); Random random = new Random(); for (int i = 0; i < list.size(); i++) { colorList.add(colors[random.nextInt(3)]); bitmapDescriptors.add(textureList.get(0)); } aMap.addPolyline(new PolylineOptions().setCustomTexture(BitmapDescriptorFactory .fromResource(R.drawable.custtexture)) //setCustomTextureList(bitmapDescriptors) // .setCustomTextureIndex(texIndexList) .addAll(list) .useGradient(true) .width(18)); } private void addMarkerInBeijing(int number) { Random random = new Random(); //new LatLng(39.90403, 116.407525) double tem_lat = 39.9; double tem_lon = 116.4; BitmapDescriptor descriptor = BitmapDescriptorFactory.defaultMarker(); if (number == 1) { aMap.addMarker(new MarkerOptions().position(new LatLng(tem_lat, tem_lon)).icon (descriptor)); return; } for (int i = 0; i < number; i++) { LatLng latLng = new LatLng(tem_lat + random.nextDouble() * (random.nextBoolean() ? 1 : -1), tem_lon + random.nextDouble() * (random.nextBoolean() ? 1 : -1)); aMap.addMarker(new MarkerOptions().position(latLng).icon(descriptor)); } } private List<LatLng> readLatLngs() { List<LatLng> points = new ArrayList<LatLng>(); for (int i = 0; i < coords.length; i += 2) { points.add(new LatLng(coords[i + 1], coords[i])); } return points; } /** * 测试在两个坐标中间任意位置停止动画,将坐标间隔变大 */ private double[] coords = {121.550998, 29.867865, 121.5525, 29.872089, 121.556835, 29.871, 121.556674, 29.868721, 121.555858, 29.867344, 121.554131, 29.869614 }; // private double[] coords = {116.3499049793749, 39.97617053371078, // 116.34978804908442, 39.97619854213431, 116.349674596623, // 39.97623045687959, 116.34955525200917, 39.97626931100656, // 116.34943728748914, 39.976285626595036, 116.34930864705592, // 39.97628129172198, 116.34918981582413, 39.976260803938594, // 116.34906721558868, 39.97623535890678, 116.34895185151584, // 39.976214717128855, 116.34886935936889, 39.976280148755315, // 116.34873954611332, 39.97628182112874, 116.34860763527448, // 39.97626038855863, 116.3484658907622, 39.976306080391836, // 116.34834585430347, 39.976358252119745, 116.34831166130878, // 39.97645709321835, 116.34827643560175, 39.97655231226543, // 116.34824186261169, 39.976658372925556, 116.34825080406188, // 39.9767570732376, 116.34825631960626, 39.976869087779995, // 116.34822111635201, 39.97698451764595, 116.34822901510276, // 39.977079745909876, 116.34822234337618, 39.97718701787645, // 116.34821627457707, 39.97730766147824, 116.34820593515043, // 39.977417746816776, 116.34821013897107, 39.97753930933358 // , 116.34821304891533, 39.977652209132174, 116.34820923399242, // 39.977764016531076, 116.3482045955917, 39.97786190186833, // 116.34822159449203, 39.977958856930286, 116.3482256370537, // 39.97807288885813, 116.3482098441266, 39.978170063673524, // 116.34819564465377, 39.978266951404066, 116.34820541974412, // 39.978380693859116, 116.34819672351216, 39.97848741209275, // 116.34816588867105, 39.978593409607825, 116.34818489339459, // 39.97870216883567, 116.34818473446943, 39.978797222300166, // 116.34817728972234, 39.978893492422685, 116.34816491505472, // 39.978997133775266, 116.34815408537773, 39.97911413849568, // 116.34812908154862, 39.97920553614499, 116.34809495907906, // 39.979308267469264, 116.34805113358091, 39.97939658036473, // 116.3480310509613, 39.979491697188685, 116.3480082124968, // 39.979588529006875, 116.34799530586834, 39.979685789111635, // 116.34798818413954, 39.979801430587926, 116.3479996420353, // 39.97990758587515, 116.34798697544538, 39.980000796262615, // 116.3479912988137, 39.980116318796085, 116.34799204219203, // 39.98021407403913, 116.34798535084123, 39.980325006125696, // 116.34797702460183, 39.98042511477518, 116.34796288754136, // 39.98054129336908, 116.34797509821901, 39.980656820423505, // 116.34793922017285, 39.98074576792626, 116.34792586413015, // 39.98085620772756, 116.3478962642899, 39.98098214824056, // 116.34782449883967, 39.98108306010269, 116.34774758827285, // 39.98115277119176, 116.34761476652932, 39.98115430642997, // 116.34749135408349, 39.98114590845294, 116.34734772765582, // 39.98114337322547, 116.34722082902628, 39.98115066909245, // 116.34708205250223, 39.98114532232906, 116.346963237696, // 39.98112245161927, 116.34681500222743, 39.981136637759604, // 116.34669622104072, 39.981146248090866, 116.34658043260109, // 39.98112495260716, 116.34643721418927, 39.9811107163792, // 116.34631638374302, 39.981085081075676, 116.34614782996252, // 39.98108046779486, 116.3460256053666, 39.981049089345206, // 116.34588814050122, 39.98104839362087, 116.34575119741586, // 39.9810544889668, 116.34562885420186, 39.981040940565734, // 116.34549232235582, 39.98105271658809, 116.34537348820508, // 39.981052294975264, 116.3453513775533, 39.980956549928244 // }; }