雷达扫描View的简单实现

本文介绍了一种基于Android的雷达扫描视图实现方案。通过自定义ScanView并利用SweepGradient和Matrix旋转绘制雷达扫描效果。文章详细展示了如何通过代码创建雷达扫描动画,包括初始化画笔、重写onMeasure及onDraw方法等。

雷达扫描View的简单实现

关于雷达扫描我的思路是

  • 通过SweepGradient来渲染
  • Matrix旋转
  • View重绘

来实现的。

首先我们来自定一个ScanView继承自View,初始化画笔

private void initPaint() {

        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mCirclePaint.setAntiAlias(true);//消除锯齿
        mCirclePaint.setColor(0xff31C9F2);
        mCirclePaint.setStyle(Paint.Style.FILL);

        mSelctorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mSelctorPaint.setAntiAlias(true);
        mSelctorPaint.setStyle(Paint.Style.FILL);

    }

然后重写onMeasure()方法,因为我们画的雷达扫描是圆形的,要判断view的高度和宽度,选取最小的昨晚圆的直径,然后mSelctorPaint渲染。

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //获取直径
        mDiameter = getMeasuredHeight() > getMeasuredWidth() ? getMeasuredWidth() : getMeasuredHeight();
        //渐变渲染
        SweepGradient sweepGradient = new SweepGradient(mDiameter / 2.0f, mDiameter / 2.0f, Color.TRANSPARENT, Color.WHITE);
        mSelctorPaint.setShader(sweepGradient);

    }

再重写onDraw()方法开始画图

@Override
    protected void onDraw(Canvas canvas) {

        //画圆
        canvas.drawCircle(mDiameter / 2.0f, mDiameter / 2.0f, mDiameter / 2.0f, mCirclePaint);
        //把画布的多有对象与matrix联系起来
        if (mMatrix != null) {
            canvas.concat(mMatrix);
        }
        //画渐变圆
        canvas.drawCircle(mDiameter / 2.0f, mDiameter / 2.0f, mDiameter / 2.0f, mSelctorPaint);
        super.onDraw(canvas);
    }

最后开始Matrix旋转,Matrix旋转不能在主线程进行,需要另起线程

        @Override
        public void run() {
            while (isStart) {
                angel += 1;
                view.post(new Runnable() {
                    @Override
                    public void run() {
                        mMatrix = new Matrix();
                        mMatrix.preRotate(angel * direction, mDiameter / 2.0f, mDiameter / 2.0f);
                        view.invalidate();
                    }
                });
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

Activity的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:orientation="vertical">

        <Button
            android:id="@+id/btn_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开启"
            />

        <Button
            android:id="@+id/btn_stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="结束"
            />
        <com.chenz.demo.scanviewdemo.ScanView
            android:id="@+id/scanView"
            android:layout_width="300dp"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"/>

    </LinearLayout>
</LinearLayout>

在Activity调用ScanView.startScan()方法开始雷达扫描,stopScan()方法停止扫描。

最后附上Demo地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值