Java Android,在另一个线程休眠600毫秒之前,我无法更新的图像src
我想给人一种系统按下按钮的感觉。当用户按下按钮时使用这两个图像,我想在两个图像的显示之间使用一个线程来创建相同的效果 但是系统没有按照预期更新按钮src。恢复我想更改src,等待600毫秒,然后再次更新。有人能给我一个方向吗Java Android,在另一个线程休眠600毫秒之前,我无法更新的图像src,java,android,multithreading,Java,Android,Multithreading,我想给人一种系统按下按钮的感觉。当用户按下按钮时使用这两个图像,我想在两个图像的显示之间使用一个线程来创建相同的效果 但是系统没有按照预期更新按钮src。恢复我想更改src,等待600毫秒,然后再次更新。有人能给我一个方向吗 switch (color) { case 1: //green // first image Main.imageButtonGreen.setImageResource(R.drawable.light_green); //this is ju
switch (color) {
case 1: //green
// first image
Main.imageButtonGreen.setImageResource(R.drawable.light_green);
//this is just to make it sleep to give the sensation that the button was pressed
try {
Blink blink = new Blink();
Thread t = new Thread(blink);
t.run();
t=null;
}
catch (Exception e){if (Main.debug) Log.d("Blink.blink Switch color= ", e.getMessage());}
//scond image
Main.imageButtonGreen.setImageResource(R.drawable.dark_green);
break;
}
我建议您使用Handler或AsyncTask。我会这样做: 在UI线程中创建处理程序: 现在就打电话
UIhandler.postDelayed(new Runnable(){
@Override
public void run() {
button.setBackgroundColor(Color.GREEN);
}}, 600);
或者更好地使更改颜色更平滑
final long startTime = SystemClock.uptimeMillis();
final long duration = 600;
//here specify what interpolator you like
final Interpolator interpolator = new LinearInterpolator();
//here you can pass whatever you want
final int startColor = Color.GREEN;
final int endColor = Color.CYAN;
//take start color components
final int startRed = Color.red(startColor);
final int startGreen = Color.green(startColor);
final int startBlue = Color.blue(startColor);
//take delta color components
final int deltaRed = Color.red(endColor)-startRed;
final int deltaGreen = Color.green(endColor)-startGreen;
final int deltaBlue = Color.blue(endColor)-startBlue;
UIhandler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - startTime;
float t = interpolator.getInterpolation((float) elapsed / duration);
if (t < 1.0) {
button.setBackgroundColor(Color.argb(255, (int)(startRed+t*deltaRed), (int)(startGreen+t*deltaGreen), (int)(startBlue+t*deltaBlue)));
// Post again 16ms later.
UIhandler.postDelayed(this, 16);
} else{
//to restore default values
button.setBackgroundColor(endColor);
}
}
});
您还可以通过将Color.argb中的值从1传递到255来更改alpha参数,作为第一个参数此代码片段的可能副本肯定不足。如何更新颜色变量?眨眼runnable做什么。。。颜色只是一个表示按钮的int。我有4个按钮,每个按钮调用发送int作为标识符的函数。但这一点都不重要。
final long startTime = SystemClock.uptimeMillis();
final long duration = 600;
//here specify what interpolator you like
final Interpolator interpolator = new LinearInterpolator();
//here you can pass whatever you want
final int startColor = Color.GREEN;
final int endColor = Color.CYAN;
//take start color components
final int startRed = Color.red(startColor);
final int startGreen = Color.green(startColor);
final int startBlue = Color.blue(startColor);
//take delta color components
final int deltaRed = Color.red(endColor)-startRed;
final int deltaGreen = Color.green(endColor)-startGreen;
final int deltaBlue = Color.blue(endColor)-startBlue;
UIhandler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - startTime;
float t = interpolator.getInterpolation((float) elapsed / duration);
if (t < 1.0) {
button.setBackgroundColor(Color.argb(255, (int)(startRed+t*deltaRed), (int)(startGreen+t*deltaGreen), (int)(startBlue+t*deltaBlue)));
// Post again 16ms later.
UIhandler.postDelayed(this, 16);
} else{
//to restore default values
button.setBackgroundColor(endColor);
}
}
});