录制效果不是很好,实际效果比较平缓。

效果:

 

自定义雷达效果_JAVA

 

代码较少,就都贴出来了,注释也标明比较详细,可以参考。

 

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