Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android,在另一个线程休眠600毫秒之前,我无法更新的图像src_Java_Android_Multithreading - Fatal编程技术网

Java Android,在另一个线程休眠600毫秒之前,我无法更新的图像src

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

我想给人一种系统按下按钮的感觉。当用户按下按钮时使用这两个图像,我想在两个图像的显示之间使用一个线程来创建相同的效果

但是系统没有按照预期更新按钮src。恢复我想更改src,等待600毫秒,然后再次更新。有人能给我一个方向吗

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);
        }
    }
});