import android.content.Context;
import android.graphics.*;
import android.graphics.LinearGradient;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
public class ScanView extends View {
private final Paint mPaint;
private final Path path;
private final int n = 6;
private final float R = 250;
private final float R0 = 240;
private final float R1 = 300;
private final Path path1;
private final Handler handler;
private SweepGradient sweepGradient;
private SweepGradient sweepGradient1;
private DashPathEffect dashPathEffect;
private int rotate = 0;
private Path path0;
private DashPathEffect dashPathEffect1;
private android.graphics.LinearGradient linearGradient;
public ScanView(Context context) {
this(context, null);
}
public ScanView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ScanView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
setLayerType(LAYER_TYPE_SOFTWARE, mPaint);
path = new Path();
path1 = new Path();
path0 = new Path();
handler = new Handler() {
/**
* Subclasses must implement this to receive messages.
*
* @param msg
*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
removeCallbacksAndMessages(null);
invalidate();
}
};
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (sweepGradient == null) {
sweepGradient = new SweepGradient(0, 0, Color.WHITE, Color.parseColor("#FF5B50F2"));
sweepGradient1 = new SweepGradient(0, 0, Color.WHITE, Color.parseColor("#FF5B50F2"));
float degree = 360 / n;
for (int i = 0; i < 6; i++) {
if (i == 0) {
path0.moveTo((float) (Math.sin(Math.toRadians(degree) * i) * R0), (float) Math.cos(Math.toRadians(degree) * i) * R0);
path.moveTo((float) (Math.sin(Math.toRadians(degree) * i) * R), (float) Math.cos(Math.toRadians(degree) * i) * R);
path1.moveTo((float) (Math.sin(Math.toRadians(degree) * i) * R1), (float) Math.cos(Math.toRadians(degree) * i) * R1);
} else {
path0.lineTo((float) (Math.sin(Math.toRadians(degree) * i) * R0), (float) Math.cos(Math.toRadians(degree) * i) * R0);
path.lineTo((float) (Math.sin(Math.toRadians(degree) * i) * R), (float) Math.cos(Math.toRadians(degree) * i) * R);
path1.lineTo((float) (Math.sin(Math.toRadians(degree) * i) * R1), (float) Math.cos(Math.toRadians(degree) * i) * R1);
}
}
dashPathEffect = new DashPathEffect(new float[]{R, R / 2}, 0);
dashPathEffect1 = new DashPathEffect(new float[]{R1, R1 / 2}, 0);
linearGradient = new LinearGradient(
getMeasuredWidth() / 2,
0,
getMeasuredWidth() / 2,
getMeasuredHeight(),
Color.parseColor("#FF5B50F2"),
Color.parseColor("#FFFFFFFF"), Shader.TileMode.CLAMP);
path.close();
path1.close();
}
mPaint.setShader(linearGradient);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawColor(Color.parseColor("#FFFFFFFF"));
canvas.translate(getMeasuredWidth() / 2, getMeasuredHeight() / 2);
canvas.drawCircle(0, 0, 400, mPaint);
// canvas.save();
if (rotate >= 360) {
rotate = 0;
}
canvas.rotate(rotate, 0, 0);
rotate = rotate + 360 / n;
drawPath1(canvas);
drawPath(canvas);
// canvas.restore();
drawPath0(canvas);
// drawInnerShape(canvas);
handler.sendEmptyMessageDelayed(0, 200);
}
private void drawPath1(Canvas canvas) {
mPaint.setStrokeWidth(10);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.WHITE);
mPaint.setShader(sweepGradient1);
mPaint.setPathEffect(dashPathEffect1);
canvas.drawPath(path1, mPaint);
}
private void drawPath(Canvas canvas) {
mPaint.setStrokeWidth(10);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.WHITE);
mPaint.setShader(null);
mPaint.setPathEffect(dashPathEffect);
canvas.drawPath(path, mPaint);
}
private void drawPath0(Canvas canvas) {
mPaint.setStrokeWidth(10);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.parseColor("#FF547DF6"));
mPaint.setPathEffect(null);
mPaint.setShader(null);
canvas.drawPath(path0, mPaint);
}
}