Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如何通过LatLng点的ArrayList为标记设置动画?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Google Maps API V2来获取当前用户的位置,并使用on@R_616_5352@nChanged侦听器记录他的路线.当用户记录他们的路线时,我将在每个位置检测到的所有LatLng保存在一个arraylist中.当用户停止记录他们的路线时,我在arraylist的第一个点放置一个标记.我现在的问题是我希望通过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
            }
        }
    });
}

有人可以帮帮我吗?

updatE
我最近的尝试是这样的

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++;
            }

解决方法

试试这个代码::
首先是MarkerAnimation类:

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,请注明来意。