Good day!
There are three circles drawn with Canvas. It is necessary to start a color change with different periodicity in different streams. I try to implement through AsyncTask, but the objects are not redrawn. What is the problem?
Class:
public class Draw2D extends View{ public Draw2D(Context context) { super(context); } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); //Ширина и высота прямоугольника int WidthRec = 100; int HeightRec = 200; //Рассчитываем на основе холста и параметров высоты и ширины прямоугольника, точки для построения int tLeft = (canvas.getWidth()/2)-WidthRec; int tRigth = (canvas.getWidth()/2)+WidthRec; int tTop = (canvas.getHeight()/2)-HeightRec; int tBottom = (canvas.getHeight()/2)+HeightRec; int RadiusCir = 30; int Spaces = 70; int tCxCir = canvas.getWidth()/2; int tCyCir1 = tTop+RadiusCir+Spaces; int tCyCir2 = tCyCir1+RadiusCir+Spaces; int tCyCir3 = tCyCir2+RadiusCir+Spaces; //Цвет заливки mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.WHITE); canvas.drawPaint(mPaint); //Прямоугольник mPaint.reset(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.BLACK); canvas.drawRect(tLeft,tTop,tRigth,tBottom, mPaint); //1 Круг mPaint.reset(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.BLACK); canvas.drawCircle(tCxCir, tCyCir1, RadiusCir, mPaint); //2 Круг canvas.drawCircle(tCxCir, tCyCir2, RadiusCir, mPaint); //3 Круг canvas.drawCircle(tCxCir, tCyCir3, RadiusCir, mPaint); if (FlagFirst) { asyncTask1 = new MyAsyncTask(canvas,tCxCir, tCyCir1, RadiusCir, 1100, this); asyncTask2 = new MyAsyncTask(canvas,tCxCir, tCyCir2, RadiusCir, 2443, this); asyncTask3 = new MyAsyncTask(canvas,tCxCir, tCyCir3, RadiusCir, 3750, this); asyncTask1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); asyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); asyncTask3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); FlagFirst = false; } } } An asynchronous stream:
class MyAsyncTask extends AsyncTask<Void, Integer, Void> { final int[] CountColor = {Color.RED,Color.YELLOW,Color.GREEN}; private int mCx; private int mCy; private int mR; private int UsDelay; private Canvas mcanvas; private View mV; public MyAsyncTask(Canvas canvas, int Cx, int Cy, int R, int delay, View v) { mCx = Cx; mCy = Cy; mR = R; UsDelay = delay; mcanvas = canvas; mV = v; } @Override protected Void doInBackground(Void... params) { int i = 0; while (true){ if (i > 2){ i = 0;} publishProgress(i); i++; SystemClock.sleep(UsDelay); } } @Override protected void onProgressUpdate(Integer... values) { mPaint.reset(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.BLACK); mcanvas.drawCircle(mCx, mCy, mR, mPaint); mPaint.reset(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(CountColor[values[0]]); mcanvas.drawCircle(mCx, mCy, mR, mPaint); mV.invalidate(); } }