我正在编写一个应用程序,我的一个视图需要不断地使用定时器闪烁,但我很难让它眨眼。
这是我的处理程序代码
@SuppressWarnings("All")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
try {
circle.setVisibility(View.VISIBLE);
Thread.sleep(100);
circle.setVisibility(View.INVISIBLE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
所以我经常向一些INTERVAL
的处理程序发送一条空消息,我希望图像在100毫秒内可见,然后再次隐藏。但问题是,在方法完成之前,我的UI元素将不会刷新。我是怎么做到的?
提前致谢。
答案 0 :(得分:1)
Thread t = new Thread() {
@Override
public void run() {
try {
while (!isInterrupted()) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
if(circle.isVisible()){circle.setVisibility(View.VISIBLE);}
else{
circle.setVisibility(View.INVISIBLE);
}
}
});
}
} catch (InterruptedException e) {
}
}
};
t.start();
答案 1 :(得分:0)
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what == 1) circle.setVisibility(View.VISIBLE);
if(msg.what == 2) circle.setVisibility(View.INVISIBLE);
}
};
然后发送消息1& 2某处。
答案 2 :(得分:0)
这是一个runnable的例子,它可以切换可见性并无限地重新发布自己,每100毫秒延迟一次。您遇到的问题是您正在停止主UI线程,所以没有其他任何事情会发生,您的程序可能正在冻结吗?无论如何,这是一种解决方案。另一个可能是在另一个帖子中发帖。
final Handler mHandler = new Handler();
final View circle = ....;
Runnable blink = new Runnable() {
@Override
public void run() {
int vis = circle.getVisibility();
if(vis == View.VISIBLE){
circle.setVisibility(View.INVISIBLE);
}else{
circle.setVisibility(View.VISIBLE);
}
mHandler.postDelayed(this, 100);
}
};
mHandler.post(blink);
答案 3 :(得分:0)
上述解决方案(Handler
,Thread
...)的替代方法是创建Animator
并依赖于Androids灵活的动画功能。
在此代码段中,您可以直接在View
的visibility-property上制作动画,而您需要定义自定义TimeInterpolator
(仅返回两个不同的值0.0和1.0),如下所示:
final ObjectAnimator anim = ObjectAnimator.ofInt(circle, "visibility",
View.VISIBLE, View.INVISIBLE);
anim.setRepeatMode(Animation.REVERSE);
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(1000);
anim.setInterpolator(new TimeInterpolator() {
@Override
public float getInterpolation(float input) {
return Math.round(input);
}
});
anim.start();