Android 如何在不知道自己翻译了多少次的情况下按顺序执行TranslateImation';你要做什么(安卓)?

Android 如何在不知道自己翻译了多少次的情况下按顺序执行TranslateImation';你要做什么(安卓)?,android,translate-animation,Android,Translate Animation,这个问题很简单,但我试图在其他类似的问题中寻找解决方案,但我做不到。 我有一个arraylistpath包含类型为coordina的对象,该对象包含两个浮点X和Y,即坐标。实质上,它是一个坐标列表。我需要我的ImageView图像在视图上的地图上移动,在列表路径中包含的坐标之间进行几次后续平移 对于固定数量的翻译,可以很容易地做到这一点,执行第一次翻译并将其附加到setAnimationListener,它可以捕捉第一个动画的结尾,然后在那一刻开始第二个动画,依此类推。我尝试在我的列表路径上使用

这个问题很简单,但我试图在其他类似的问题中寻找解决方案,但我做不到。 我有一个arraylistpath包含类型为coordina的对象,该对象包含两个浮点X和Y,即坐标。实质上,它是一个坐标列表。我需要我的ImageView图像在视图上的地图上移动,在列表路径中包含的坐标之间进行几次后续平移

对于固定数量的翻译,可以很容易地做到这一点,执行第一次翻译并将其附加到setAnimationListener,它可以捕捉第一个动画的结尾,然后在那一刻开始第二个动画,依此类推。我尝试在我的列表路径上使用while循环迭代该过程,因为我无法真正知道动画开始时路径中有多少坐标。 结果是动画在前两个坐标上继续,然后跳转执行路径中最后两个坐标的动画,忽略其中的所有坐标

发生了什么事?我把东西弄乱了

List<Coordinata> path; // properly filled with coordinates
Coordinata coordTempStart;
Coordinata coordTempArrival;
ImageView image;

ListIterator<Coordinata> pathIterator = path.listIterator();
    if(pathIterator.hasNext()){
        coordTempStart = (Coordinata) pathIterator.next();
    }
    if(pathIterator.hasNext()){
        coordTempArrival = (Coordinata) pathIterator.next();
        animation = new TranslateAnimation(coordTempStart.getX(), 
                   coordTempArrival.getX(),
                   coordTempStart.getY(), 
                   coordTempArrival.getY()); 
        animation.setDuration(3000);   
        image.startAnimation(animation);
    } 

    while(pathIterator.hasNext()){
        coordTempStart=coordTempArrival;
        coordTempArrival = (Coordinata) pathIterator.next();
            animation.setAnimationListener(new TranslateAnimation.AnimationListener(){
            public void onAnimationStart(Animation arg0) {}    
            public void onAnimationRepeat(Animation arg0) {}
            public void onAnimationEnd(Animation arg0) {
                animation = new TranslateAnimation(coordTempStart.getX(), 
                           coordTempArrival.getX(),
                           coordTempStart.getY(), 
                           coordTempArrival.getY()); 
                animation.setDuration(3000); 
                image.startAnimation(animation);
            }
        }); 

    }
列表路径;//正确填写坐标
Coordina coordTempStart;
协调人;协调人;
图像视图图像;
ListIterator pathIterator=path.ListIterator();
if(pathIterator.hasNext()){
coordTempStart=(Coordina)pathIterator.next();
}
if(pathIterator.hasNext()){
coordTempArrival=(Coordina)pathIterator.next();
动画=新的TranslateAnimation(coordTempStart.getX(),
coordTempArrival.getX(),
coordTempStart.getY(),
coordTempArrival.getY());
动画。设置持续时间(3000);
图像。开始动画(动画);
} 
while(pathIterator.hasNext()){
coordTempStart=coordTempArrival;
coordTempArrival=(Coordina)pathIterator.next();
animation.setAnimationListener(新的TranslateAnimation.AnimationListener(){
onAnimationStart(动画arg0){}
onAnimationRepeat(动画arg0){}
onAnimationEnd上的公共无效(动画arg0){
动画=新的TranslateAnimation(coordTempStart.getX(),
coordTempArrival.getX(),
coordTempStart.getY(),
coordTempArrival.getY());
动画。设置持续时间(3000);
图像。开始动画(动画);
}
}); 
}

我建议使用ObjectAnimator和AnimatorSet设置视图动画。对象animator仅适用于api>11,但如果必须保持兼容性,则可以使用NineodelDroid

您的代码如下(伪代码):


为了给object animator设置正确的参数,请参考官方文档

,为了完整起见,我发布了用于解决问题的实际代码:

// in this list you can insert as many animations you want
List<Animator> animations = new ArrayList<Animator>();

AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator xTrasnlationObjectAnimator = ObjectAnimator.ofFloat(image, View.TRANSLATION_X, (float)300);
xTrasnlationObjectAnimator.setRepeatCount(0);
ObjectAnimator yTrasnlationObjectAnimator = ObjectAnimator.ofFloat(image, View.TRANSLATION_Y, (float)300);
yTrasnlationObjectAnimator.setRepeatCount(0);
ObjectAnimator x2TrasnlationObjectAnimator = ObjectAnimator.ofFloat(image, View.TRANSLATION_X, (float)400);
x2TrasnlationObjectAnimator.setRepeatCount(0);

animations.add(xTrasnlationObjectAnimator);
animations.add(yTrasnlationObjectAnimator);
animations.add(x2TrasnlationObjectAnimator);

animatorSet.playSequentially(animations);

animatorSet.start();
//在此列表中,您可以插入任意数量的动画
列表动画=新建ArrayList();
AnimatorSet AnimatorSet=新的AnimatorSet();
ObjectAnimator xTrasnlationObjectAnimator=ObjectAnimator.offload(image,View.TRANSLATION_X,(float)300);
xTrasnlationObjectAnimator.setRepeatCount(0);
ObjectAnimator yTrasnlationObjectAnimator=ObjectAnimator.offload(image,View.TRANSLATION_Y,(float)300);
yTrasnlationObjectAnimator.setRepeatCount(0);
ObjectAnimator x2TrasnlationObjectAnimator=ObjectAnimator.offload(image,View.TRANSLATION_X,(float)400);
X2TrasnlationObject Animator.setRepeatCount(0);
添加(xTrasnlationObjectAnimator);
添加(yTrasnlationObjectAnimator);
添加(x2TrasnlationObject Animator);
动画集。按顺序播放(动画);
animatorSet.start();
// in this list you can insert as many animations you want
List<Animator> animations = new ArrayList<Animator>();

AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator xTrasnlationObjectAnimator = ObjectAnimator.ofFloat(image, View.TRANSLATION_X, (float)300);
xTrasnlationObjectAnimator.setRepeatCount(0);
ObjectAnimator yTrasnlationObjectAnimator = ObjectAnimator.ofFloat(image, View.TRANSLATION_Y, (float)300);
yTrasnlationObjectAnimator.setRepeatCount(0);
ObjectAnimator x2TrasnlationObjectAnimator = ObjectAnimator.ofFloat(image, View.TRANSLATION_X, (float)400);
x2TrasnlationObjectAnimator.setRepeatCount(0);

animations.add(xTrasnlationObjectAnimator);
animations.add(yTrasnlationObjectAnimator);
animations.add(x2TrasnlationObjectAnimator);

animatorSet.playSequentially(animations);

animatorSet.start();