使用arraylist设置视图动画

hc8w905p  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(315)

我有一个图像视图,一个数组列表和一个按钮。我的数组列表有多个数字。例如1、2、2、4、3。当我按下按钮时,我想用arraylist中的数字来设置imageview的动画。根据样本列表。arraylist[0]=1 imageview将向上设置动画,arraylist[1]=2 imageview将向下设置动画。动画将继续,所有的arraylist都在里面。为此,我必须使用“for循环”。但动画不继续,动画循环不工作。只有arraylist[0]正在工作,然后停止。`当我第二次按下按钮时,arraylist[2]正在工作,然后停止。我得一直按按钮才能工作。我只想按一次按钮,然后我就想把所有的数组都列出来。

//imageViewPlay=button     hareketler=ArrayList    imageViewMario=ImageView
    imageViewPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (int i=0;i<hareketler.size();i++){
                if (hareketler.get(0)==1){
                    imageViewMario.animate().y(imageViewMario.getY() -imageViewEngel.getHeight()-7).setDuration(2000).withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            hareketler.remove(0);
                        }
                    });

                }
                if (hareketler.get(0)==2){
                    imageViewMario.animate().y(imageViewMario.getY() +imageViewEngel.getHeight()+7).setDuration(2000).withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            hareketler.remove(0);
                        }
                    });
                }
                if (hareketler.get(0)==3){
                    imageViewMario.animate().x(imageViewMario.getX() +imageViewEngel.getHeight()+7).setDuration(2000).withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            hareketler.remove(0);
                        }
                    });
                }
                if (hareketler.get(0)==4){
                   imageViewMario.animate().x(imageViewMario.getX() -imageViewEngel.getHeight()-7).setDuration(2000).withEndAction(new Runnable() {
                       @Override
                       public void run() {
                           hareketler.remove(0);
                       }
                   });
                }
            }

        }
    });
dgiusagp

dgiusagp1#

这是因为 withEndAction 不是同步调用 for 没有等待第一个动画结束。您需要的是递归函数,它将在动画结束时再次调用。这样地:

private void playAnimation(){
    if (hareketler.get(0)==1){
        imageViewMario.animate().y(imageViewMario.getY() -imageViewEngel.getHeight()-7).setDuration(2000).withEndAction(runnable);
    }else if .... and so on

还创建一个runnable,它将在动画结束时再次调用该方法

private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        hareketler.remove(0);
        playAnimation()
    }
};

在您的click listener中:

imageViewPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            playAnimation()
        }
    });

希望这能奏效。

irlmq6kh

irlmq6kh2#

'只有arraylist[0]正在工作,然后停止',这是因为您用值0对此行进行了硬编码:

if (hareketler.get(0)==...)

这将始终只获取数组的第一项。
您正在增加for循环,但不是从数组中获得的位置。

if (hareketler.get(i)==...)

它将使用for循环的i值来增加数组的位置。
当然还有:

hareketler.remove(i)

相关问题