2015-04-03 71 views
0

我正在創建一個由畫布組成的畫布來繪製圓圈,畫布顏色將每5秒更換一次。這裏的代碼是我做的,但它沒有改變顏色,請告訴我我在哪裏做了這個錯誤如何在5秒內動態更改Android中畫布的顏色。

package com.developer.milandemoapp; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 

public class Automode_Activity extends Activity { 


    Thread timer; 
    boolean Count=true; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new MyView(this)); 




    } 
    public class MyView extends View{ 

     public MyView(Context context) { 
      super(context); 

     } 
     @Override 
     protected void onDraw(final Canvas canvas) { 
      super.onDraw(canvas); 


      getWidth(); 
      getHeight(); 
      final int radius = 25; 
      System.currentTimeMillis(); 

      final Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 

      canvas.drawPaint(paint); 
      paint.setColor(Color.parseColor("#D50000")); 

      final Paint paint1 = new Paint(); 
      paint1.setStyle(Paint.Style.FILL); 
      canvas.drawPaint(paint1); 
      paint1.setColor(Color.parseColor("#33691E")); 

      //Count=0; 
      final Thread delay_thread= new Thread(new Runnable() { 

       @Override 
       public void run() { 
       while(true){ 
       try{ 
        Thread.sleep(5000); 
        change_colors(); 

       } 
       catch(Exception e) 
       { 
        Log.e("Error:",e.getMessage()); 
       } 
       }} 

       private void change_colors() { 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 

          if(Count) 
          { 
          paint1.setColor(Color.parseColor("#D50000")); 
          } 
           //paint1.setColor(Color.parseColor("#33691E")); 
          else 
          { 
          paint1.setColor(Color.parseColor("#33691E")); 
          } 
          Count=!Count; 
          canvas.drawCircle(300, 300, radius, paint1); 
          canvas.drawCircle(400, 300, radius, paint1); 
          canvas.drawCircle(500, 300, radius, paint1); 
          canvas.drawCircle(600, 300, radius, paint1); 
          canvas.drawCircle(700, 300, radius, paint1); 
          canvas.drawCircle(800, 300, radius, paint1); 
          canvas.drawCircle(900, 300, radius, paint1); 

         } 
        }); 
       } 
      }); 

      canvas.drawCircle(300, 300, radius, paint); 
      canvas.drawCircle(400, 300, radius, paint); 
      canvas.drawCircle(500, 300, radius, paint); 
      canvas.drawCircle(600, 300, radius, paint); 
      canvas.drawCircle(700, 300, radius, paint); 
      canvas.drawCircle(800, 300, radius, paint); 
      canvas.drawCircle(900, 300, radius, paint); 
      delay_thread.start(); 
       } 
     } 
} 
+0

你的顏色只改變一次? – Muthu 2015-04-03 06:37:14

+0

這不會改變他只有一種顏色的傢伙@Muthu – 2015-04-03 06:38:43

+0

你需要每5秒調用invalidate()才能使其工作!嘗試使用處理程序後推遲的方法來實現這個 – Muthu 2015-04-03 06:40:56

回答

2

嗯,你們有混亂的:

  1. 嘗試在onDraw()無法初始化任何東西 - 這種方法是每次重繪視圖時調用。

  2. 你已經搞砸了顏色 - 你正在畫圓圈paint,但你正在改變paint1在你的線程。

  3. 我不明白你爲什麼叫這一切getWidth()getHeight()System.currentTimeMillis()

所以,我已經清理一點點的所有代碼和優化它。這就是它應該如何工作:

public class MainActivity extends Activity { 

    private MyView view; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     view = new MyView(this); 
     setContentView(view); 
    } 

    @Override 
    protected void onStart() { 
     // Restart view thread 
     view.startChangingColors(5000); 
     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     // Stopping thread 
     view.stopRunnning(); 
     super.onStop(); 
    } 

    public class MyView extends View { 

     private Thread colorThread; 

     private final int color1 = Color.parseColor("#D50000"); 
     private final int color2 = Color.parseColor("#33691E"); 

     private Paint paint; 
     private Paint clearingPaint; 

     private final int radius = 25; 

     private boolean switcher = true; 

     public MyView(Context context) { 
      super(context); 

      // Init goes here 
      paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 
      paint.setColor(color1); 

      clearingPaint = new Paint(); 
      clearingPaint.setStyle(Paint.Style.FILL); 
      clearingPaint.setColor(Color.WHITE); 

      // Run thread 
      startChangingColors(5000); 
     } 

     public void stopRunnning() { 
      // Stopping previous thread 
      if (colorThread != null) { 
       colorThread.interrupt(); 
      } 
     } 

     /** 
     * Starting a thread that changes colors every n miliseconds 
     * 
     * @param delay 
     */ 
     public void startChangingColors(final int delayMilis) { 
      // Hust a safety check 
      stopRunnning(); 

      colorThread = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        boolean interrupted = false; 
        while (!interrupted) { 
         try { 
          runOnUiThread(new Runnable() { 

           @Override 
           public void run() { 
            changeColors(); 
           } 
          }); 

          Thread.sleep(delayMilis); 

         } catch (Exception e) { 
          if (e instanceof InterruptedException) { 
           // We just woked up to close all this 
           interrupted = true; 
          } else { 
           Log.e("Error:", e.getMessage()); 
          } 
         } 
        } 

       } 
      }); 
      colorThread.start(); 
     } 

     public void changeColors() { 
      if (switcher) { 
       paint.setColor(color1); 
      } else { 
       paint.setColor(color2); 
      } 
      switcher = !switcher; 
      // Redraw view 
      invalidate(); 
     } 

     @Override 
     protected void onDraw(final Canvas canvas) { 
      // Clear the canvas 
      canvas.drawPaint(clearingPaint); 
      // Draw circles 
      canvas.drawCircle(300, 300, radius, paint); 
      canvas.drawCircle(400, 300, radius, paint); 
      canvas.drawCircle(500, 300, radius, paint); 
      canvas.drawCircle(600, 300, radius, paint); 
      canvas.drawCircle(700, 300, radius, paint); 
      canvas.drawCircle(800, 300, radius, paint); 
      canvas.drawCircle(900, 300, radius, paint); 
     } 
    } 
} 
+0

感謝兄弟爲我指出我的錯誤@ Paul Freez – 2015-04-03 07:23:51

0
// define boolean to change color after 5000 ms 
boolean change = false; 

// prepare runnable which will be called after 5000 ms 
// through handler 
Runnable mRunnable = new Runnable() { 

    public void run() { 

    change_color(change); 
    change = !change; 

    } 


}; 

// create handler 
Handler mHandler = new Handler(); 
mHandler.postDelayed(mRunnable, 5000); 

// use receivedChange variable in change_colors() 
// and change canvas color based on that 
private void change_colors(boolean receivedChange) { 

     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 

       if(receivedChange == true) { 
        paint1.setColor(Color.parseColor("#D50000")); 
       } else { 
        paint1.setColor(Color.parseColor("#33691E")); 
       } 

        canvas.drawCircle(300, 300, radius, paint1); 
        canvas.drawCircle(400, 300, radius, paint1); 
        canvas.drawCircle(500, 300, radius, paint1); 
        canvas.drawCircle(600, 300, radius, paint1); 
        canvas.drawCircle(700, 300, radius, paint1); 
        canvas.drawCircle(800, 300, radius, paint1); 
        canvas.drawCircle(900, 300, radius, paint1); 
       } 
      }); 
1

試試看看這個代碼。我使用處理程序對代碼進行了一些更改。這會給你一個基本的想法。

public class Automode_Activity extends Activity { 


    Thread timer; 
    boolean Count=true; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new MyView(this)); 




    } 
    public class MyView extends View{ 

    Runnable runnable= new Runnable() { 

    public void run() { 
     this.invalidate(); 
    } 
    }; 

    Handler handler = new Handler(); 

    public MyView(Context context) { 
      super(context); 

    } 
    @Override 
    protected void onDraw(final Canvas canvas) { 
      super.onDraw(canvas); 


      getWidth(); 
      getHeight(); 
      final int radius = 25; 
      System.currentTimeMillis(); 

      final Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 

      canvas.drawPaint(paint); 

      if(Count) 
      { 
       paint.setColor(Color.parseColor("#D50000")); 
      }     
      else 
      { 
       paint.setColor(Color.parseColor("#33691E")); 
      } 
      Count=!Count; 

      canvas.drawCircle(300, 300, radius, paint); 
      canvas.drawCircle(400, 300, radius, paint); 
      canvas.drawCircle(500, 300, radius, paint); 
      canvas.drawCircle(600, 300, radius, paint); 
      canvas.drawCircle(700, 300, radius, paint); 
      canvas.drawCircle(800, 300, radius, paint); 
      canvas.drawCircle(900, 300, radius, paint); 
      handler.postDelayed(runnable, 5000); 
       } 
     } 
} 
+0

你的答案完全合格,謝謝@Muthu – 2015-04-03 07:39:33

+0

如果它有助於upvote他們。 – Muthu 2015-04-03 07:40:33