录制效果不是很好,实际效果比较平缓。
效果:
代码较少,就都贴出来了,注释也标明比较详细,可以参考。
1. 自定义RadarView继承View
public class RadarView extends View {
private int width, height; //画圆的坐标位置以及半径
private Paint mCirclePaint; //画笔
private Paint mShaderPaint; //画笔
private Matrix mMatrix = new Matrix();
private int start = 90; //开始的角度
private Handler mHandler = new Handler();
private int count = 0;
private Shader mShader;//渲染
Runnable run = new Runnable() {
@Override
public void run() {
start++;
mMatrix.setRotate(start, width / 2, height / 2); //为矩阵设置旋转坐标
postInvalidate();
start = start == 360 ? 0 : start;
count++;
mHandler.postDelayed(run, 10);
if (count >= 1000) { //当count 大于等于1000时,发消息通知停止扫描
Message message = new Message();
message.what = 1;
handlerStop.sendMessage(message);
}
}
};
final Handler handlerStop = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
count = 0;
mHandler.removeCallbacks(run);
break;
}
super.handleMessage(msg);
}
};
public RadarView(Context context) {
this(context, null);
}
public RadarView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
mHandler.post(run);
}
/**
* 初始化画笔等,避免在onDraw创建,导致重绘的情况
*/
private void init() {
mCirclePaint = new Paint(); //创建圆环画笔
mCirclePaint.setColor(getResources().getColor(R.color.color_aacccccc));
mCirclePaint.setStrokeWidth(1); //设置画笔的宽度
mCirclePaint.setAntiAlias(true); //设置抗锯齿模式
mCirclePaint.setStyle(Paint.Style.STROKE); //设置画笔风格
mShaderPaint = new Paint(); //创建扫描线画笔
mShaderPaint.setAntiAlias(true);
//设置画笔风格为填充模式
mShaderPaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
width = getMeasuredWidth(); //获取view的宽度
height = getMeasuredHeight(); //获取view的高度
//以中点为圆心
canvas.drawCircle(width / 2, height / 2, width / 12, mCirclePaint);
canvas.drawCircle(width / 2, height / 2, width / 6, mCirclePaint);
canvas.drawCircle(width / 2, height / 2, width / 4, mCirclePaint);
canvas.drawCircle(width / 2, height / 2, width / 3, mCirclePaint);
//画直线
canvas.drawLine(width / 2 - width / 3, height / 2, width / 2 + width / 3, height / 2, mCirclePaint);
//画直线
canvas.drawLine(width / 2, height / 2 - width / 3, width / 2, height / 2 + width / 3, mCirclePaint);
if (mShader == null) {//实例扫描渲染,扫描边由透明->进行渐变
mShader = new SweepGradient(width / 2, height / 2, Color.TRANSPARENT, getResources().getColor(R.color.color_808080);
}
//渲染对象
mShaderPaint.setShader(mShader);//这个很重要
canvas.concat(mMatrix);
//画扫描图像
canvas.drawCircle(width / 2, height / 2, width / 3, mShaderPaint);
}
}
2.xml引用包名+RadarView:
<aikaifa.radar.RadarView
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.颜色值string
<color name="color_808080">#808080</color>
<color name="color_aacccccc">#aacccccc</color>
https://mp.weixin.qq.com/s/cENx5BXdEglM6x5Zihrtfw