实现在Android中搜索的动画

时间:2014-04-05 13:37:20

标签: android animation

当我的一个进程在后台工作时,我一直在尝试实现一个简单的动画。

动画的要求是在屏幕中心的圆形图像视图周围创建涟漪效果。

在Google环聊视频会话中可以看到示例,当个人资料圈周围有一些不断增长的圈子动画,或者在Tinder等搜索个人资料的应用中。

我试图将一些4个圆圈放在另一个上,并在for循环中改变它们的可见性:

ImageView one = (ImageView) rootView.findViewById(R.id.imageView1);
    ImageView two = (ImageView) rootView.findViewById(R.id.imageView2);
    ImageView three = (ImageView) rootView.findViewById(R.id.imageView3);
    ImageView four = (ImageView) rootView.findViewById(R.id.imageView4);

    try {
        for(int i=1; i<10; i++){
            one.setVisibility(one.VISIBLE);
            Thread.sleep(1000);

            two.setVisibility(two.VISIBLE);
            Thread.sleep(1000);

            three.setVisibility(three.VISIBLE);
            Thread.sleep(1000);

            four.setVisibility(four.VISIBLE);
            Thread.sleep(1000);

            one.setVisibility(one.INVISIBLE);
            Thread.sleep(1000);

            two.setVisibility(two.INVISIBLE);
            Thread.sleep(1000);

            three.setVisibility(three.INVISIBLE);
            Thread.sleep(1000);

            four.setVisibility(four.INVISIBLE);
            Thread.sleep(1000);

        }
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

但是当我运行它时,应用程序崩溃了。有更好的方法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是在一个单独的线程上执行的吗?如果没有,您应该将其移动到一个Thread.sleep(),如果从不在主线程上使用。

话虽如此,您无法从主UI线程执行与UI相关的工作(即setVisibility())。要使用您当前的方法,您需要在每个runOnUiThread()来电时添加setVisibility()

如果您不想这样做,可以将代码修改为以下内容:

ImageView one = (ImageView) rootView.findViewById(R.id.imageView1);
ImageView two = (ImageView) rootView.findViewById(R.id.imageView2);
ImageView three = (ImageView) rootView.findViewById(R.id.imageView3);
ImageView four = (ImageView) rootView.findViewById(R.id.imageView4);


final ImageView images[] = {one, two, three, four};
new Thread() {

    public void run() {

        for(int i=1; i<10; i++){
            for (int j=0; j<images.length; j++) {
                images[i].setAlpha(255);
                images[i].postInvalidate();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            for (int j=0; j<images.length; j++) {
                images[i].setAlpha(0);
                images[i].postInvalidate();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}.start();