大佬教程收集整理的这篇文章主要介绍了android – 如何通过LatLng点的ArrayList为标记设置动画?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
需要注意的是阵列不需要排序,因为我记录了它们来的点.我已经尝试使用for循环遍历数组并发送值,但是我得到了一个错误
说“UnkNown source”和NullPointer异常.
这是我的代码:
case R.id.action_replay: int o; for(o=0; o<oldlocPoints.size(); ++o){ if(--o > 1){lastPos = oldlocPoints.get(--o);} toPos = oldlocPoints.get(++o); animateMarker(markerStart,lastPos,toPos); } return true;
这就是我如何尝试通过标记进行动画制作.我遇到的主要困难是在run()中它似乎只是想要最终类型值,所以我不知道如何取悦它.
//Animates marker through the @R_616_5352@ns saved from the recorded route public void animateMarker(final Marker marker,LatLng lastPos,final LatLng toPos) { final long duration = 1600; final Handler handler = new Handler(); this.lastPos = lastPos; this.toPos = toPos; final long start = SystemClock.uptimeMillis(); final int o; Projection proj = map.getProjection(); Point startPoint = proj.toScreen@R_616_5352@n(lastPos); final LatLng startLatLng = proj.fromScreen@R_616_5352@n(startPoint); Log.d(tag,"" + lastPos + "" + toPos); final Interpolator interpolator = new AccelerateDecelerateInterpolator(); handler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - start; float t = interpolator.geTinterpolation((float) elapsed / duration); double lng = t * toPos.longitude + (1 - t) * startLatLng.longitude; double lat = t * toPos.latitude + (1 - t) * startLatLng.latitude; markerStart.setPosition(new LatLng(lat,lng)); //markerStart.setPosition(interpolator.interpolate(t,target,replayEnd)); if (t < 1.0) { //Post again 16ms later == 60 frames per second handler.postDelayed(this,32); } else { //Animation ended } } }); }
有人可以帮帮我吗?
while (i<oldlocPoints.size()){ final long duration = 32; final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); Projection proj = map.getProjection(); final LatLng toPos = oldlocPoints.get(i/3); Point startPoint = proj.toScreen@R_616_5352@n(oldlocPoints.get(i)); final LatLng startLatLng = proj.fromScreen@R_616_5352@n(startPoint); final Interpolator interpolator = new AccelerateDecelerateInterpolator(); handler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - start; float t = interpolator.geTinterpolation((float) elapsed / duration); double lng = t * toPos.longitude + (1 - t) * startLatLng.longitude; double lat = t * toPos.latitude + (1 - t) * startLatLng.latitude; markerStart.setPosition(new LatLng(lat,lng)); //markerStart.setPosition(interpolator.interpolate(t,replayEnd)); if (t < 1.0) { //Post again 16ms later == 60 frames per second handler.postDelayed(this,32); } else { //Animation ended } } }); i++; }
public class MarkerAnimation { static GoogleMap map; ArrayList<LatLng> _trips = new ArrayList<>() ; Marker _marker; LatLngInterpolator _latLngInterpolator = new LatLngInterpolator.Spherical(); public void animateLine(ArrayList<LatLng> Trips,GoogleMap map,Marker marker,Context current){ _trips.addAll(Trips); _marker = marker; animateMarker(); } public void animateMarker() { TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() { @Override public LatLng evaluate(float fraction,LatLng startValue,LatLng endvalue) { return _latLngInterpolator.interpolate(fraction,startValue,endvalue); } }; Property<Marker,LatLng> property = Property.of(Marker.class,LatLng.class,"position"); ObjectAnimator animator = ObjectAnimator.ofObject(_marker,property,typeEvaluator,_trips.get(0)); //ObjectAnimator animator = ObjectAnimator.o(view,"alpha",0.0f); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationCancel(Animator animation) { // animDrawable.stop(); } @Override public void onAnimationRepeat(Animator animation) { // animDrawable.stop(); } @Override public void onAnimationStart(Animator animation) { // animDrawable.stop(); } @Override public void onAnimationEnd(Animator animation) { // animDrawable.stop(); if (_trips.size() > 1) { _trips.remove(0); animateMarker(); } } }); animator.setDuration(300); animator.start(); }
以及谷歌开发人员为您预先编写的_latLngInterpolator:
public interface LatLngInterpolator { public LatLng interpolate(float fraction,LatLng a,LatLng b); public class Spherical implements LatLngInterpolator { @Override public LatLng interpolate(float fraction,LatLng from,LatLng to) { // http://en.wikipedia.org/wiki/Slerp double fromLat = toradians(from.latitudE); double fromLng = toradians(from.longitudE); double toLat = toradians(to.latitudE); double toLng = toradians(to.longitudE); double cosFromLat = cos(fromLat); double cosToLat = cos(toLat); // Computes Spherical interpolation coefficients. double angle = computeAnglebetween(fromLat,fromLng,toLat,toLng); double sinAngle = sin(anglE); if (sinAngle < 1E-6) { return from; } double a = sin((1 - fraction) * anglE) / sinAngle; double b = sin(fraction * anglE) / sinAngle; // Converts from polar to vector and interpolate. double x = a * cosFromLat * cos(fromLng) + b * cosToLat * cos(toLng); double y = a * cosFromLat * sin(fromLng) + b * cosToLat * sin(toLng); double z = a * sin(fromLat) + b * sin(toLat); // Converts interpolated vector BACk to polar. double lat = atan2(z,sqrt(x * x + y * y)); double lng = atan2(y,X); return new LatLng(todegrees(lat),todegrees(lng)); } private double computeAnglebetween(double fromLat,double fromLng,double toLat,double toLng) { // haversine's formula double dLat = fromLat - toLat; double dLng = fromLng - toLng; return 2 * asin(sqrt(pow(sin(dLat / 2),2) + cos(fromLat) * cos(toLat) * pow(sin(dLng / 2),2))); } } }
并在您的地图活动中将其命名为:
@H_590_14@markerAnimation.animateLine(TripPoints,map,MovingMarker,context);
以上是大佬教程为你收集整理的android – 如何通过LatLng点的ArrayList为标记设置动画?全部内容,希望文章能够帮你解决android – 如何通过LatLng点的ArrayList为标记设置动画?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。