首页 > 其他分享 >Android实现雷达扫描效果

Android实现雷达扫描效果

时间:2023-12-23 15:38:48浏览次数:27  
标签:radarScanAnim 扫描 private ObjectAnimator override fun 雷达 Android

手把手教程,先看效果,能用得上的再继续往下看……

Android实现雷达扫描效果_雷达图

注:生成的gif图扫描有点慢,下面代码有参数可以控制速度。

针对上图效果,以UI方不方便切图,可以有两种实现方式。


  • 方式一:UI将整个雷达切图(除中间头像外)

针对整个雷达图做rotation动画

完整代码:

布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#1A071D"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/ivRadar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:src="@drawable/img_radar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher_round"
        app:layout_constraintBottom_toBottomOf="@id/ivRadar"
        app:layout_constraintEnd_toEndOf="@id/ivRadar"
        app:layout_constraintStart_toStartOf="@id/ivRadar"
        app:layout_constraintTop_toTopOf="@id/ivRadar" />

</androidx.constraintlayout.widget.ConstraintLayout>

Activity代码:MainActivity

class MainActivity : AppCompatActivity() {

    private var radarScanAnim: ObjectAnimator? = null

    private lateinit var ivRadar: AppCompatImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ivRadar = findViewById(R.id.ivRadar)
    }

    override fun onResume() {
        super.onResume()
        startScan()
    }

    override fun onPause() {
        super.onPause()
        stopScan()
    }

    /**
     * 开始扫描
     */
    private fun startScan() {
        if (radarScanAnim == null) {
            radarScanAnim = ObjectAnimator.ofFloat(ivRadar, "rotation", 0f, 360f)
        }
        radarScanAnim?.duration = 3000 //扫描一圈的时间
        radarScanAnim?.interpolator = LinearInterpolator()
        radarScanAnim?.repeatCount = ObjectAnimator.INFINITE //循环 -1
        radarScanAnim?.start()
    }

    /**
     * 结束扫描
     */
    private fun stopScan() {
        radarScanAnim?.cancel()
    }
}

资源文件:img_radar.png


  • 方式二:UI不切图

将雷达分为两部分:底座图(即4个同心圆)和扫描图,针对扫描图做rotation动画

完整代码:

布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#1A071D"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/ivWave"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:src="@drawable/shape_wave"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/ivSweep"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/shape_sweep"
        app:layout_constraintBottom_toBottomOf="@id/ivWave"
        app:layout_constraintEnd_toEndOf="@id/ivWave"
        app:layout_constraintStart_toStartOf="@id/ivWave"
        app:layout_constraintTop_toTopOf="@id/ivWave" />

    <androidx.appcompat.widget.AppCompatImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher_round"
        app:layout_constraintBottom_toBottomOf="@id/ivWave"
        app:layout_constraintEnd_toEndOf="@id/ivWave"
        app:layout_constraintStart_toStartOf="@id/ivWave"
        app:layout_constraintTop_toTopOf="@id/ivWave" />

</androidx.constraintlayout.widget.ConstraintLayout>

Activity代码:MainActivity

class MainActivity : AppCompatActivity() {

    private var radarScanAnim: ObjectAnimator? = null

    private lateinit var ivWave: AppCompatImageView
    private lateinit var ivSweep: AppCompatImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ivWave = findViewById(R.id.ivWave)
        ivSweep = findViewById(R.id.ivSweep)

    }

    override fun onResume() {
        super.onResume()
        startScan()
    }

    override fun onPause() {
        super.onPause()
        stopScan()
    }

    /**
     * 开始扫描
     */
    private fun startScan() {
        if (radarScanAnim == null) {
            radarScanAnim = ObjectAnimator.ofFloat(ivSweep, "rotation", 0f, 360f)
        }
        radarScanAnim?.duration = 3000 //扫描一圈的时间
        radarScanAnim?.interpolator = LinearInterpolator()
        radarScanAnim?.repeatCount = ObjectAnimator.INFINITE //循环 -1
        radarScanAnim?.start()
        ivSweep.visibility = View.VISIBLE
    }

    /**
     * 结束扫描
     */
    private fun stopScan() {
        radarScanAnim?.cancel()
        ivSweep.visibility = View.INVISIBLE
    }
}

资源文件:res/drawable/shape_wave.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--最外层圆-->
    <item>
        <shape android:shape="oval">
            <!--颜色值按UI图来,这里我随便写的-->
            <solid android:color="#AAF4F4F5" />
        </shape>
    </item>
    <!--次外层圆-->
    <item
        android:bottom="40dp"
        android:left="40dp"
        android:right="40dp"
        android:top="40dp">
        <shape android:shape="oval">
            <solid android:color="#AAECECF4" />
        </shape>
    </item>
    <!--次内层圆-->
    <item
        android:bottom="80dp"
        android:left="80dp"
        android:right="80dp"
        android:top="80dp">
        <shape android:shape="oval">
            <solid android:color="#AAFCFCFC" />
        </shape>
    </item>
    <!--内层圆-->
    <item
        android:bottom="140dp"
        android:left="140dp"
        android:right="140dp"
        android:top="140dp">
        <shape android:shape="oval">
            <size
                android:width="100dp"
                android:height="100dp" />
            <solid android:color="#AAE4E4EC" />
        </shape>
    </item>
</layer-list>

资源文件:res/drawable/shape_sweep.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <size
        android:width="300dp"
        android:height="300dp" />
    <gradient
        android:endColor="#1AF4E8F8"
        android:startColor="#AAF8F8F4"
        android:type="sweep" />
</shape>

以上就是两种实现方式,关键点是Android动画ObjectAnimator类,这里我们使用了rotation动画,当然ObjectAnimator还支持其他如alpha等各种动画,就不细说了

结束~~~




标签:radarScanAnim,扫描,private,ObjectAnimator,override,fun,雷达,Android
From: https://blog.51cto.com/u_16465992/8945085

相关文章

  • Android对接微信登录记录
    Android对接微信登录记录-Stars-One的杂货小窝Android项目要对接下微信登录,稍微记录下踩坑点代码1.添加依赖implementation'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'2.声明Activity在你的清单文件添加下面Activity声明<application> <activity android......
  • Android开发——添加图片
    1、首先选择一张需要的图片,通过左侧的ResourceManage选择“+”并选择ImportDrawables选择一张图片并调整以下两个内容这两个内容的作用借用谷歌官方的Android开发教程的内容:*Android设备具有不同的屏幕尺寸(手机、平板电脑和电视等),而且这些屏幕也具有不同的像素尺寸。也......
  • 关于Android图像Bitmap类你要知道的一切
    Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色值。Android中的Bitmap是用来表示图像的类,它可以用来加载、显示和处理图像。你可以通过Bitmap类来创建一个......
  • Android新手程序员提升技术最快的3个方法,你知道吗?
    前言对于刚刚进入职场的1-3年的程序员来说,首要任务无疑是全身心地投入到技术开发工作中,用最专业的技术知识和熟练度来开展工作。这项任务需要你花费大量的时间和精力去学习、探索和实践。只有充分掌握了当前技术的使用方法和功能,以及行业内的趋势和动态,你才能够在这个领域中不断进......
  • Android平台RTSP流如何添加动态水印后转推RTMP或轻量级RTSP服务
    技术背景我们在对接外部开发者的时候,遇到这样的技术诉求,客户用于地下管道检测场景,需要把摄像头的数据拉取过来,然后叠加上实时位置、施工单位、施工人员等信息,然后对外输出新的RTSP流,并本地录制一份带动态水印叠加后的数据。整个过程,因为摄像头位置一直在变化,所以需要整体尽可能的低......
  • android添加c语言的可执行程序
    在android源码的external目录下添加test目录。在test目录下新建test.c文件和Android.mk文件。test.c文件例如:#include<stdio.h>intmain(){printf("helloworld\n");return0;}Android.mk文件:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LO......
  • Android应用开发长按拖拽-Flutter的LongPressDraggable控件回调函数onDraggableCancel
    onDraggableCanceled介绍LongPressDraggable的onDraggableCanceled回调在拖动被取消时触发。拖动可能会被取消,例如用户在拖动开始后移动了太快或在放置之前取消了拖动。onDraggableCanceled的使用以下是如何使用onDraggableCanceled的示例:LongPressDraggable<int>(//......
  • Android创建引导时的镂空View漏空view
     importandroid.graphics.RectFimportandroid.view.Viewimportandroid.view.ViewGroupobjectMyGuideUtil{/***@baseView在哪个view基础上进行镂空*/funguideMain(baseView:View){vallocation=IntArray(2)baseView.ge......
  • 优测云服务平台总结Android开发常见风险及解决方案
    Android作为一个普及度、成熟度极高的平台,每天都有大量新APP涌现。开发一款Android应用,除了要有新颖的创意和高效的性能,保证安全性也是不容忽视的问题。俗话说打铁还需自身硬。接下来,我们会陆续与大家分享一些常见、不常见的代码风险问题,希望对您的Android开发工作有一定的......
  • Android开发基本规范整理
    1前言为了有利于项目维护、增强代码可读性、提升CodeReview效率以及规范团队安卓开发效率,故提出以下安卓开发规范2AS规范工欲善其事,必先利其器。尽量使用最新的稳定版的IDE进行开发;编码格式统一为UTF-8;编辑完.java、.xml等文件后一定要格式化,格式化,格式化(win快捷键cr......