package com.basic.security.widget; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.animation.LinearInterpolator; import com.basic.security.base.BaseApplication; import com.basic.security.utils.ResolutionAdaptation; public class CircleView extends BaseShapeView { public float value; long lastTime = 0; long startAngle = 0; private Paint mPaint; private ValueAnimator anim; private int color = Color.parseColor("#74F8F5"); public CircleView(Context context) { super(context); init(); } public CircleView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CircleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public void setMeasuredDimension1(int measuredWidth, int measuredHeight) { setMeasuredDimension(measuredWidth, measuredHeight); } private void init() { setLayerType(LAYER_TYPE_SOFTWARE, null); mPaint = new Paint(); mPaint.setColor(Color.parseColor("#74F8F5")); mPaint.setStrokeWidth(BaseApplication.getApplication().activity.getResources().getDimension(ResolutionAdaptation.h3())); mPaint.setStyle(Paint.Style.STROKE); startAnimation(); // BaseApplication.getApplication().executorService.execute(()->{ // while (true) { // startAngle += 10; // BaseApplication.getApplication().activity.runOnUiThread(()->{ // CircleView.this.invalidate(); // }); // SystemClock.sleep(100); // } // }); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawSmallCircle(canvas); drawMiddleCircle(canvas); drawBigCircle(canvas); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } private void drawSmallCircle(Canvas canvas) { try { int width = this.getWidth(); int height = this.getHeight(); int radius = (width > height ? height : width) / 2; int smallRadius = radius - 25; mPaint.setStrokeWidth(8); // mPaint.setColor(Color.parseColor("#03fcd3")); mPaint.setColor(color); if (smallRadius > 0) { canvas.drawCircle(width / 2, height / 2, smallRadius, mPaint); } } catch (Exception e) { e.printStackTrace(); } } private void drawMiddleCircle(Canvas canvas) { int width = this.getWidth(); int height = this.getHeight(); int radius = (width > height ? height : width) / 2; radius = radius - 10; mPaint.setStrokeWidth(4); // mPaint.setColor(Color.parseColor("#03fcd3")); mPaint.setColor(color); try { int x = 0; int y = 0; x = width / 2 - radius; y = height / 2 - radius; RectF oval = new RectF(x, y, radius * 2 + x, radius * 2 + y); if (lastTime == 0) { lastTime = System.currentTimeMillis(); } if (System.currentTimeMillis() - lastTime > 80) { startAngle = startAngle % 360; lastTime = System.currentTimeMillis(); } int gap1 = 20; int gap2 = 45; canvas.drawArc(oval, startAngle, 100, false, mPaint); canvas.drawArc(oval, startAngle + 100 + gap1, 360 - (100 + gap1 + gap2), false, mPaint); } catch (Exception e) { e.printStackTrace(); } } private void drawBigCircle(Canvas canvas) { int width = this.getWidth(); int height = this.getHeight(); int radius = (width > height ? height : width) / 2; mPaint.setStrokeWidth(2); // mPaint.setColor(Color.parseColor("#03fcd3")); mPaint.setColor(color); try { int x = 0; int y = 0; x = width / 2 - radius; y = height / 2 - radius; RectF oval = new RectF(x, y, radius * 2 + x, radius * 2 + y); if (lastTime == 0) { lastTime = System.currentTimeMillis(); } if (System.currentTimeMillis() - lastTime > 80) { startAngle = startAngle % 360; lastTime = System.currentTimeMillis(); } canvas.drawArc(oval, 360 - (float) (startAngle + 100 - 12.5), 45, false, mPaint); canvas.drawArc(oval, 360 - (float) (startAngle + 100 - 12.5) + (360 - 90) / 2 + 45, 45, false, mPaint); // canvas.drawArc(oval, startAngle + 100 + gap1, 360 - (100 + gap1 + gap2), false, mPaint); } catch (Exception e) { e.printStackTrace(); } } public void startAnimation() { anim = ValueAnimator.ofFloat(0, (int) BaseApplication.getApplication().activity.getResources().getDimension(com.basic.security.utils.RUtils.R_dimen_h310)); anim.setRepeatCount(ValueAnimator.INFINITE); anim.setDuration(2000); anim.setInterpolator(new LinearInterpolator()); anim.addUpdateListener(animation -> { if (System.currentTimeMillis() - lastTime > 85) { // System1.out.println("CircleView.startAnimation " + (System.currentTimeMillis() - lastTime)); lastTime = System.currentTimeMillis(); startAngle += 10; value = (Float) animation.getAnimatedValue(); postInvalidate(); } }); anim.start(); } public int getColor() { return color; } public void setColor(int color) { this.color = color; } }