该文章同步发布到CSDN,转载请注明出处

简书:http://blog.csdn.net/ling9400/article/details/70182583

这篇博客应该算是博主真正意义上的第一篇自定义控件的博客,所以写出这个控件之后第一时间进行记录,废话不多说,先上效果图:

这里写图片描述

这个图在我CSDN博客的上一篇文章中已经上过了的,在上篇文章中就说明要做出这个效果。
自定义控件无非就是那几个步骤:

  1. onMeasure
  2. onLayout(ViewGroup中会重写,这里直接集成View,所以不会重写)
  3. onDraw(所有自定义View的重要步骤)

现在根据上面的几个步骤简要说明一下:
首先,看下属性:

这里写图片描述

然后是控件的构造方法以及初始化操作和自定义属性的取值:

这里写图片描述

自定义属性在这:

这里写图片描述

然后在是重点步骤————onMeasure

这里写图片描述

onLayout这里就不需要重写了,所以直接来到onDraw,直接上代码

protected void onDraw(Canvas canvas) {super.onDraw(canvas);//先画两个外圆mPaint.setStrokeWidth(1);mPaint.setColor(Color.BLUE);canvas.drawCircle(mWidth/2, mHeight/2, wRadius, mPaint);canvas.drawCircle(mWidth/2, mHeight/2, nRadius, mPaint);//背景图片Bitmap bgMap = BitmapFactory.decodeResource(getResources(), mapBg);float scaleWidth = (float) (nRadius*2 - 80)/bgMap.getWidth();float scaleHeight = (float) (nRadius*2 - 50)/bgMap.getHeight();//缩放图片Matrix mMatrix = new Matrix();mMatrix.postScale(scaleWidth, scaleHeight);Bitmap bgNew = Bitmap.createBitmap(bgMap, 0,0, bgMap.getWidth(), bgMap.getHeight(), mMatrix, true);canvas.drawBitmap(bgNew, mWidth/2 - bgNew.getWidth()/2 , mHeight/2 - bgNew.getHeight()/2 , mPaint);//缩放扫描的背景图片Matrix scanMa = new Matrix();Bitmap scaningMap = BitmapFactory.decodeResource(getResources(), mapScaning);scanMa.postScale(0.8f, 0.8f);Bitmap newScan = Bitmap.createBitmap(scaningMap,0,0,scaningMap.getWidth(),scaningMap.getHeight(),scanMa, true);`//滚动圆滚动的矩形mPaint.setStrokeWidth(gWidth);loadingRectF = new RectF(mWidth/2 - gRadius, mWidth/2 -gRadius,mWidth/2 +gRadius, mWidth/2 + gRadius);//扫描bitmapif(!isFirst){isFirst = true;scanRect = new Rect(mWidth/2 - gRadius + 20, mWidth/2 - gRadius + 20,mWidth/2 +gRadius - 20, mWidth/2 + gRadius - 20);}//开始扫描if(isStart && !isEnd){canvas.drawBitmap(newScan, mWidth/2 - newScan.getWidth()/2, mHeight/2 - newScan.getHeight()/2, mPaint);mPaint.setColor(Color.RED);//画三个滚动的圆弧canvas.drawArc(loadingRectF, topDegree, arc, false, mPaint);canvas.drawArc(loadingRectF, bottomDegree, arc, false, mPaint);canvas.drawArc(loadingRectF, thirdDegree, arc, false, mPaint);mPaint.setColor(Color.GRAY);//画扫描线 -- 通过修改top值来实现一直往下扫描效果canvas.drawRect(scanRect.left, scanRect.top, scanRect.right, scanRect.top + 1, mPaint);scanRect.top += scanDis;if(scanRect.top >= scanRect.bottom){scanRect.top = (int) loadingRectF.top + 20;}//圆弧滚动 -- 通过修改圆弧的初始值来实现滚动startRotating();}else{//结束扫描  完成扫描Bitmap downMap = BitmapFactory.decodeResource(getResources(), mapDown);Matrix downMatrix = new Matrix();downMatrix.postScale(2.0f, 2.0f);Bitmap newDownMap = Bitmap.createBitmap(downMap, 0,0, downMap.getWidth(), downMap.getHeight(),downMatrix, true);canvas.drawBitmap(newDownMap, mWidth/2 - newDownMap.getWidth()/2, mHeight/2 - newDownMap.getHeight()/2, mPaint);}}

代码里面都注释的很清楚了,我想不需要另外在说明了。还有几个方法就是圆弧滚动的实现以及开始扫描和完成扫描

这里写图片描述
这里写图片描述

最后,通过调用startScan方法即可执行扫描,调用stopScan完成扫描。

PS:最后说明一句,由于开始扫描和完成扫描没有实现动画效果感觉有点突兀,希望懂的朋友可以指点或者帮忙实现下也是可以滴,哈哈···

Android 自定义控件之腾讯安全卫士扫描相关推荐

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

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

  2. Android自定义控件--仿安全卫士中的一键加速【圆形进度条】

    最近看到a10615的:Android自定义控件–仿安全卫士中的一键加速.自己零零散散学习了几个月,也想尝试下.几天的功夫总算把它弄出来,虽然没有泓洋的强大,但是该有的自定义属性也有了,先来看看效果图 ...

  3. 我的新书《Android自定义控件入门与实战》出版啦

    前言:当你回首往事时,不以虚度年华而悔恨,不以碌碌无为而羞耻,那你就可以骄傲的跟自己讲,你不负此生 [Android自定义控件入门与实战]勘误:https://blog.csdn.net/harvic ...

  4. Android开发-在Android里接入腾讯云推流SDK实现直播推流的功能

    前 言 如今,在国内移动互联网发展了几年的时间,移动开发技术也相对的成熟,在咱们日常使用的手机App中也少不了直播的功能,不管是娱乐类.游戏类.体育类还是教育类等的App都会有直播的功能,可以说直播的 ...

  5. Android studio 接入腾讯TBSx5内核的解决方案

      Android studio 接入腾讯TBSx5内核的解决方案 首页我们查看一下腾讯浏览服务的官网:     https://x5.tencent.com/tbs/guide/sdkInit.ht ...

  6. Android自定义控件进阶12-事件分发机制原理

    Android 事件分发机制详解,在上一篇文章 事件分发机制原理 中简要分析了一下事件分发机制的原理,原理是十分简单的,一句话就能总结:责任链模式,事件层层传递,直到被消费. 虽然原理简单,但是随着 ...

  7. Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

    Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

  8. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  9. android里的editText怎么用,Android自定义控件EditText使用详解

    本文实例为大家分享了Android自定义控件EditText的具体代码,供大家参考,具体内容如下 自定义控件分三种: 1. 自绘控件 2. 组合控件 3. 继承控件 代码已上传到 github 以后的 ...

最新文章

  1. 转载: Python os 模块的功能以及子函数介绍
  2. 2020年度中国生命科学十大进展公布 | 中国科协生命科学学会联合体
  3. android把255转换成字节,android 上传参数设置,字符转化成字节,包装流等
  4. Ionic(ionicframework)一款接近原生的Html5移动App开发框架 中文网
  5. Thinkphp 使用过程中,模型中使用其它表却总是没起作用的解决办法
  6. 通过udp及vlc传递视频流
  7. 工作变得简单又高效 试试这八个WebApp
  8. 最小生成树基础 (Kruskal)
  9. 模2运算 / 模2算法(模2加法、模2减法、模2乘法、模2除法)
  10. java对外接口开发实例
  11. 怎样在nature上查文献?
  12. BPF BTF 详细介绍
  13. 计算机毕业设计ssm汽车租赁管理系统mfobv系统+程序+源码+lw+远程部署
  14. 顶岗实习周记java方向_java程序员的实习周记
  15. 10行代码实现抽奖助手自动参与抽奖
  16. js开发飞机大战需求文档
  17. Kaggle-泰坦尼克号-机器学习/数据挖掘学习笔记
  18. c#字符串转为json对象与json转对象
  19. 计算机教育 专业知识,计算机教育
  20. 【DX-BT24蓝牙模块连接Arduino与手机透传教程】

热门文章

  1. NAS组建日记(一):来块大硬盘先—HGST 10TB NAS硬盘开箱小测
  2. /etc/ssh/sshd_config 关建字:PermitRootLogin no  禁示以root身份登录服务器
  3. C# winform窗体 ComboBox控件
  4. iOS 根据日期判断星座源代码
  5. WM_Paint 消息疑问解析
  6. C#操作SQLite数据库增、删、改、查 实例
  7. c++中,可以用类名直接访问非静态成员函数?
  8. 基础拾遗------泛型详解
  9. Android—WebView与JS交互
  10. IOS开发地理编码与反向编码