目录

效果展示

实现步骤

1.绘制圆圈遮罩

这里我们是用了混合模式来实现圆圈部分的扣除,这里我们用到了PorterDuff.Mode.CLEAR。

/*** 绘制圆圈遮罩* @param canvas*/
private void drawCircleMask(Canvas canvas) {canvas.save();//目标图Dstcanvas.drawRect(new Rect(0,0,getWidth(),getHeight()), mPaint);//设置混合模式mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));//源图Src,重叠区域右下角部分canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 3, mPaint);//清除混合模式mPaint.setXfermode(null);canvas.restore();
}

这时效果如下:

2.绘制两个动画效果的圆圈

咱们绘制的两个图片如下:

我们要做的就是通过计算将Bitmap缩放成与之前遮罩效果的圆圈一样大,因为我们这里用的两张图片是一样大的,因此我们只需要计算出内圆圈图片与遮罩圆圈的缩放比例即可,由于之前咱们给遮罩圆圈设置的半径为:控件宽度 / 3。

因此我们缩放后的圆圈Bitmap宽高应当是如下图所示的中间红线部分加两边蓝色部分的总长。

其中中间红线部分就是:控件宽度 / 3 ,而蓝线部分可以通过PhotoShop等工具测量,然后根据与红线部分的比例求出,代码如下,其中mInnerCircleBitmap是内圆,mOutCircleBitmap是外圆。

/*** 画圆圈外部的圆圈图片*/
private void drawBitmapCircle(Canvas canvas) {if(mInnerCircleBitmap == null){int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);mInnerCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_innercircle);mInnerCircleBitmap = Bitmap.createScaledBitmap(mInnerCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);}if(mOutCircleBitmap == null){int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);mOutCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_outcircle);mOutCircleBitmap = Bitmap.createScaledBitmap(mOutCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);}int left = (getWidth() - mInnerCircleBitmap.getWidth()) / 2;int top = (int) (getWidth() / 2 - getWidth() / 3 - getWidth() / 1.5f / 8);canvas.drawBitmap(mInnerCircleBitmap,left,top,mPaint);canvas.drawBitmap(mOutCircleBitmap,left,top,mPaint);
}

这时效果如下:

3.实现旋转动画效果

接下来我们就可以通过ValueAnimator来实现圆圈的旋转效果了,从文章开头的效果我们可以看出两个圆圈的旋转方向是不一样的,因此我们逻辑上也要注意一个是顺时针旋转另一个是逆时针旋转,代码如下:

private float mDegress = 0;//旋转角度
private void init() {//定义动画valueAnimator = ValueAnimator.ofFloat(0f, 360f);valueAnimator.setRepeatCount(ValueAnimator.INFINITE);valueAnimator.setRepeatMode(ValueAnimator.RESTART);valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.setDuration(6000);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mDegress = (float) animation.getAnimatedValue();postInvalidate();}});valueAnimator.start();
}
/*** 画圆圈外部的圆圈图片*/
private void drawBitmapCircle(Canvas canvas) {if(mInnerCircleBitmap == null){int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);mInnerCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_innercircle);mInnerCircleBitmap = Bitmap.createScaledBitmap(mInnerCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);}if(mOutCircleBitmap == null){int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);mOutCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_outcircle);mOutCircleBitmap = Bitmap.createScaledBitmap(mOutCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);}int left = (getWidth() - mInnerCircleBitmap.getWidth()) / 2;int top = (int) (getWidth() / 2 - getWidth() / 3 - getWidth() / 1.5f / 8);//顺时针旋转canvas.save();canvas.rotate(mDegress,getWidth() / 2, getWidth() / 2);canvas.drawBitmap(mInnerCircleBitmap,left,top,mPaint);canvas.restore();//逆时针旋转canvas.save();canvas.rotate(-mDegress,getWidth() / 2, getWidth() / 2);canvas.drawBitmap(mOutCircleBitmap,left,top,mPaint);canvas.restore();
}

这时效果如下:

4.增加提示文字

绘制文字就比较简单了,主要是用于提示用户需要进行的操作,代码如下:

canvas.drawText("请把脸移入圈内",getWidth() / 2, (float) (getWidth() * 1.2),mTextPaint);

最终效果如下:

案例源码

以上实现步骤中的源码我都是拆分开讲的,详细完整的代码大家可以通过如下地址获取:

https://gitee.com/itfitness/face-check-view

自定义人脸识别动画效果相关推荐

  1. Android实现人脸识别动画效果

    效果展示 实现步骤 1.绘制圆圈遮罩 这里我们是用了混合模式来实现圆圈部分的扣除,这里我们用到了PorterDuff.Mode.CLEAR /*** 绘制圆圈遮罩* @param canvas*/pr ...

  2. 人脸识别动画实现详解(SurfaceView + ObjectAnimator + 三角函数 = 炫酷动画)

    前言 开门见山,先来看下效果吧. 看到这么酷炫的效果图,不得不赞叹一下我们的设计师.然而,站在程序员的角度上看,除了酷炫之外更多的是复杂.但是,上面我们所看到的还只是最简单的一种形态而已.更加复杂的情 ...

  3. 电脑分屏软件_Fcpx分屏插件 41组视频分割可自定义分屏动画效果插件 可分9屏 Split Pop...

    Fcpx分屏插件 41组视频分割可自定义分屏动画效果插件 这是一套目前小编感觉最好用的Fcpx分屏插件,一.支持4K.二.最多可分9屏.三.可微调参数调整最佳展示.四.41种效果简洁大方,涵盖各类流行 ...

  4. python构造自定义数据包_构建自定义人脸识别数据集的三种训练方法

    在接下来的几篇文章中,我们将训练计算机视觉+深度学习模型来进行面部识别.在此之前,我们首先需要收集脸部数据集. 如果你已经在使用预先准备好的数据集,比如Labeled Faces in the Wil ...

  5. ios 自定义加载动画效果

    在开发过程中,可能会遇到各种不同的场景需要等待加载成功后才能显示数据.以下是自定义的一个动画加载view效果.      在UIViewController的中加载等到效果,如下 - (void)vi ...

  6. android 自定义加载动画效果,Android 自定义View修炼-自定义加载进度动画LoadingImageView...

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  7. Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...

    有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助. 尊重原创,转载请注明出处: http://blog..net/qq137722697 ...

  8. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  9. Android仿探探社交自定义闪聊动画效果

    需要实现的效果图如探探 ### 主要实现方式 就是一个自定义控件,循环的去画圆,在圆半径增加的时候,找到圆上的3个点,然后把图片画上对应的坐标,半径越大,透明度越高 * 这里用到了一些数学知识* 求圆 ...

最新文章

  1. Prime Path(bfs)广度优先搜索
  2. 谈谈js初级封装代码
  3. Python NLPIR2016 与 wordcloud 结合生成中文词云
  4. 网络安全产品 / 相关产品简要说明
  5. 使用VS Code开发 调试.NET Core 应用程序
  6. SqlServer分组取一瓢和月初月末
  7. 如何修复XML内存“泄漏”
  8. 优秀软件架构师成长之路
  9. 《C++ Primer Plus(第六版)》(11)(第八章 函数探幽 复习题答案)
  10. 深入理解 JVM 之 垃圾回收机制
  11. 有哪些好看的字体可以免费用?看完这篇就知道了
  12. 大厂工作3年,我决定把大学到现在7年所有珍藏的书籍都分享一遍
  13. gtx660 linux驱动下载,佳能 NVIDIA GeForce GTX660 GPU 驱动程序下载-更新佳能软件(显卡)...
  14. YApi接口管理平台远程代码执行漏洞(含批量POC)
  15. VUE页面背景设置为视频
  16. CRUSH算法 - 可控、可伸缩、分布式地归置多副本数据
  17. 科普一下IP路由基础
  18. 经典论文翻译导读之《A Bloat-Aware Design for Big Data Applications》
  19. 云数据中心与传统数据中心
  20. SQL Server如何在日期里提取年份和月份

热门文章

  1. java中把年月日时间(yyyy-MM-dd)或其他时间格式转换成只有年月(yyyy-MM)或其他时间格式的简单方法
  2. 程序员鼓励师是怎样的存在?
  3. 大力哥谈 DALI - DALI-2 和 DALI v-1 产品能混用吗?
  4. LaTex 数学之分数和二项式系数
  5. 青风nrf51822开发板学习记录
  6. 基于SQLServer ,使用Java Web开发的学生信息管理系统,在校大学生和新手可参考学习
  7. SAP与ORACLE的区别分析及对比
  8. ADAS 常用缩略词(ACC,AEB,FCW,LCA,LDW...)
  9. 4.9---4.23 JIANG 将结束《C++捷径教程》 得代码上机调试工作
  10. 女性健康养生资讯网类织梦模板(带手机端)【测试可搭建】