如何每 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);
}
}
}
好吧,你搞砸了:
尽量不要在 onDraw()
中初始化任何东西 - 每次重绘视图时都会调用此方法。
你弄乱了这里的颜色 - 你用 paint
画了圆圈,但你在线程中改变了 paint1
。
我不明白你为什么把这些都叫做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);
}
}
}
我正在创建一个 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);
}
}
}
好吧,你搞砸了:
尽量不要在
onDraw()
中初始化任何东西 - 每次重绘视图时都会调用此方法。你弄乱了这里的颜色 - 你用
paint
画了圆圈,但你在线程中改变了paint1
。我不明白你为什么把这些都叫做
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);
}
}
}