如何每 5 秒动态更改 android 中 canvas 的颜色?

How to change color of canvas in android dynamically for every 5 sec.?

我正在创建一个 android 应用程序,其中包含 canvas 来绘制圆圈,并且 canvas 颜色将根据我的代码每 5 seconds.Here 改变一次做了但没有改变颜色请告诉我哪里做错了

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

试试这个代码。我已经使用 Handlers 对您的代码进行了一些更改。这会给你一个基本的想法。

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

好吧,你搞砸了:

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