当我的一个进程在后台工作时,我一直在尝试实现一个简单的动画。
动画的要求是在屏幕中心的圆形图像视图周围创建涟漪效果。
在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();
}
但是当我运行它时,应用程序崩溃了。有更好的方法吗?
提前致谢。
答案 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();