Android自定义控件入门实践之雷达扫描控件

以前因为工作的关系,对于自定义控件用的少之又少,无非就是把几个控件放置到ViewGroup内部,然后提供开放方法,就成了一个所谓的自定义控件,但是这种小伎俩太简单,面试的时候这点东西根本Hold不住场,所以工作之余还是得把这块补补,也好加深一下对控件的理解。

好,啰嗦了挺多的,我们先看一下实现的效果:


只是截取了一部分运行时图,这个控件只是重写了onDraw方法,其它一一保留给View,简单说一下这个的实现方式:

使用一只画笔用来画等距的四个圆,使用另外一只画笔画一个标准的角度渐变图。

Android提供了标准的渐变图,同样在PhotoShop中我们一样可以找到这些渐变图,这样一来,我们就可以根据UI设计师设计的套路来做同样的效果了:


线性渐变图


径向渐变图


菱形渐变图


角度渐变图


对称渐变图

好了,我们将这些基本的图绘制出来之后,它还是个静态的,我们需要将它动起来,那怎么使它动起来呢,对,我们需要线程来驱动它进行重绘,需要注意的是,线程一定要出口。

开启线程有两种方式,一种是传统的开线程的方式,使用Thread。另一种则使用向主线程消息队列中发送消息来驱动。我们使用第二种:hander.postRunnable。

来贴一下整体的代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;/*** 雷达显示控件* Created by Sahadev on 2015/12/29.* 邮箱:sahadev@foxmail.com*/
public class RadarView extends View implements Runnable {private boolean threadFlag = true;private int rotate = 0;//用于画圆的画笔private Paint circlePaint;//用于画扫描图像private Paint shaderPaint;//获得用于画圆的坐标位置以及半径int x, y;//设置扫描图像的坐标矩阵Matrix matrix = new Matrix();//用于绘制扫描图像Shader mShader;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);//为了避免在onDraw中重复创建对象,所以将一些初始化工作放入构造方法中来做circlePaint = new Paint();circlePaint.setColor(Color.WHITE);//设置画笔的宽度circlePaint.setStrokeWidth(1);//设置抗锯齿模式circlePaint.setAntiAlias(true);circlePaint.setFlags(Paint.ANTI_ALIAS_FLAG);//设置画笔风格circlePaint.setStyle(Paint.Style.STROKE);shaderPaint = new Paint();shaderPaint.setAntiAlias(true);shaderPaint.setFlags(Paint.ANTI_ALIAS_FLAG);//设置画笔风格为填充模式shaderPaint.setStyle(Paint.Style.FILL);postDelayed(this, 100);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//计算圆的坐标值及半径y = getMeasuredHeight() / 2;x = getMeasuredWidth() / 2;//为矩阵设置旋转坐标matrix.setRotate(rotate, x, y);//为了避免重复创建对象,则使用这种方式if (mShader == null)mShader = new SweepGradient(x, y, Color.TRANSPARENT, Color.BLUE);mShader.setLocalMatrix(matrix);shaderPaint.setShader(mShader);//画一个扫描图像canvas.drawCircle(x, y, x, shaderPaint);//画四个等距圆canvas.drawCircle(x, y, x, circlePaint);canvas.drawCircle(x, y, x / 2, circlePaint);canvas.drawCircle(x, y, x / 4 * 3, circlePaint);canvas.drawCircle(x, y, x / 4, circlePaint);}@Overridepublic void run() {if (threadFlag) {rotate++;postInvalidate();//如果到了360度,则重新开始rotate = rotate == 360 ? 0 : rotate;//一秒延迟这个任务postDelayed(this, 1);}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();//停止循环threadFlag = false;}}

好,这样运行起来就是我们图例所显示的样子,最后看一下内存使用以及CPU使用情况:


都不是很多,这只是最基本的,我们还可以将它进一步的优化。


有什么疑问欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 基于知识图谱注意力网络的商品推荐

论文笔记整理:康矫健,浙江大学计算机科学与技术系,硕士研究生。论文链接:https://arxiv.org/pdf/1905.07854.pdf发表会议:KDD 2019任务定义输入:协同过滤知识图谱具体来说包括两个部分,其一是用…

Java 动态调试技术原理及实践

断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象…

非常适合初学者的机器学习的数学基础笔记.pdf

本文推荐一份机器学习数学基础专辑,非常适合初学者入门,文末提供下载。机器学习,需要一定的数学基础,也需要一定的代码能力。机器学习从业者数学基础不扎实,只会用一些工具和框架,相当于某些武术家只会耍套…

LeetCode 1094. 拼车

文章目录1. 题目2. 解题1. 题目 假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。…

MySQL的锁机制和加锁原理

原文链接:https://blog.csdn.net/qq_38238296/article/details/88362999 文章目录 MySQL的锁机制和加锁原理1.行锁2.表锁3.页锁4.乐观锁和悲观锁4.1悲观锁4.2乐观锁5.1InnoDB锁的特性 6.Record Lock、Gap Lock、Next-key Lock锁6.1.Record Lock6.2.Gap Lock6.2.​…

CVPR 2019轨迹预测竞赛冠军方法总结

背景 CVPR 2019 是机器视觉方向最重要的学术会议,本届大会共吸引了来自全世界各地共计 5160 篇论文,共接收 1294 篇论文,投稿数量和接受数量都创下了历史新高,其中与自动驾驶相关的论文、项目和展商也是扎堆亮相,成为本…

TSNE画图

TSNE画图 2D图 from sklearn.manifold import TSNE import matplotlib.pyplot as plt import numpy as np# 10条数据,每条数据6维 h np.random.randn(10, 6) # 使用PCA降维到2维 tsne TSNE(n_components2, initpca, random_state0) result_2D tsne.fit_transfo…

深入探讨:为什么要做特征归一化/标准化?

文 | shine-lee源 | CSDN本文解读了一项数据预处理中的重要技术——特征归一化,提出并解答了5个相关问题,同时分析了相关方法和适用场景。写在前面Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技…

LeetCode 950. 按递增顺序显示卡牌(deque)

文章目录1. 题目2. 解题1. 题目 牌组中的每张卡牌都对应有一个唯一的整数。你可以按你想要的顺序对这套卡片进行排序。 最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。 现在,重复执行以下步骤,直到…

技术动态 | 知识图谱从哪里来:实体关系抽取的现状与未来

本文作者为:韩旭、高天宇、刘知远。转载自刘知远老师的知乎专栏,文章链接:https://zhuanlan.zhihu.com/p/91762831最近几年深度学习引发的人工智能浪潮席卷全球,在互联网普及带来的海量数据资源和摩尔定律支配下飞速提升的算力资源…

Android 兼容 Java 8 语法特性的原理分析

本文主要阐述了Lambda表达式及其底层实现(invokedynamic指令)的原理、Android第三方插件RetroLambda对其的支持过程、Android官方最新的dex编译器D8对其的编译支持。通过对这三个方面的跟踪分析,以Java 8的代表性特性——Lambda表达式为着眼点…

由Actvity启动模式之SingleInstance引起的坑的反思

以前对于Activity的启动模式只限于文字说明理解的层面,但最近的一个问题让我对启动模式有了更深的了解。 Activity有四大启动模式:standard,singleTop,singleTask,singleInstance,这些启动模式的特点就不在这里细说,主要说一下SingleInstanc…

“李宏毅老师对不起,我要去追这门美女老师的课了” ,台大陈蕴侬深度学习课程最新资料下载...

估计很多同学看到台大首先想到是李宏毅老师的“深度学习人类语言处理”课程,不过这次我们说的是台湾大学陈蕴侬老师的“应用深度学习”课程,这门课程我们之前推荐过,不过主要给大家推荐的是课程视频和课件资源。前段时间,我把这门…

超级好用的使用python批量更新MYsql,速度从一万条需要一天变道一万条需要10分钟左右

推荐网址:https://www.jb51.net/article/100747.html MySQL批量插入的语法为: UPDATE nine_tupleSET SENTI_VALUE CASE N_T_ID WHEN 1 THEN ‘1.57’ WHEN 2 THEN ‘1.3’ WHEN 3 THEN ‘1.2’ END WHERE N_T_ID IN (1,2,3)主要思想:将42W条…

论文浅尝 | 使用位置敏感的序列标注联合抽取实体和重叠关系

论文笔记整理:余海阳,浙江大学硕士,研究方向为知识图谱、自然语言处理。链接:https://wvvw.aaai.org/ojs/index.php/AAAI/article/view/4591动机之前的联合抽取实体以及实体间的关系的方法,主要是采用管道模型&#xf…

LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)

文章目录1. 题目2. 解题递归剪枝中序遍历循环剪枝1. 题目 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。 题目的意思,节点的值在[L, R]这个区间内,就加到结果里,求所有符合条件的…

OneData建设探索之路:SaaS收银运营数仓建设

背景 随着业务的发展,频繁迭代和跨部门的垂直业务单元变得越来越多。但由于缺乏前期规划,导致后期数仓出现了严重的数据质量问题,这给数据治理工作带来了很大的挑战。在数据仓库建设过程中,我们总结的问题包括如下几点&#xff1a…

Android远程服务与本地服务的特点以及功能差异

最近又重新看了点IPC的相关知识,以前看过不少Binder的知识,看到c层思路就很模糊了,回头再看也算是一种学习。 IPC全称为:interprocess communication内部进程间通信,官方地址:http://developer.android.com/intl/zh-c…

svn中文语言包安装(最详细步骤)+Language Pack+TortoiseSVN 安装

原文链接:https://blog.csdn.net/massillon/article/details/102780782 svn中文语言包安装(最详细步骤) 一. 查看自己的SVN 版本(这里省略也可以,同事1.9版本的直接在官网下载的语言包也能用,区别对待把,可以先直接在官网下载,不行再去找对应版本语言包) 1.打开SVN找…

我拿模型当朋友,模型却想泄漏我的隐私?

文 | 阿毅编 | 小轶相信大家对Facebook–Cambridge Analytica隐私泄露事件都还有印象。这事儿在当时可谓爆炸性新闻,激起了公众对数据隐私的强烈关注,也间接影响了美国总统选举结果(这不是重点)。不过从事后诸葛亮来看&#xff0c…