Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android实现人脸识别动画效果

Android实现人脸识别动画效果

原创
作者头像
程序员小顾
发布于 2021-12-09 01:31:43
发布于 2021-12-09 01:31:43
98000
代码可运行
举报
文章被收录于专栏:fjalfjal
运行总次数:0
代码可运行

效果展示

实现步骤

1.绘制圆圈遮罩

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 绘制圆圈遮罩
     * @param canvas
     */
    private void drawCircleMask(Canvas canvas) {
        canvas.save();
        //目标图Dst
        canvas.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是外圆

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 画圆圈外部的圆圈图片
     */
    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来实现圆圈的旋转效果了,从文章开头的效果我们可以看出两个圆圈的旋转方向是不一样的,因此我们逻辑上也要注意一个是顺时针旋转另一个是逆时针旋转,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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() {
            @Override
            public 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.增加提示文字

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
canvas.drawText("请把脸移入圈内",getWidth() / 2, (float) (getWidth() * 1.2),mTextPaint);

最终效果如下

案例源码

以上实现步骤中的源码我都是拆分开讲的,详细完整的代码大家可以通过如下地址获取 https://gitee.com/itfitness/face-check-view

原文链接:https://www.jianshu.com/p/9383ce973d6a

文末

您的点赞收藏就是对我最大的鼓励! 欢迎关注我,分享Android干货,交流Android技术。 对文章有何见解,或者有何技术问题,欢迎在评论区一起留言讨论!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android画布Canvas裁剪效果演示--RevealView
图片资源如下图,就是几张灰色和彩色图片 思路是利用画布canvas的裁剪,先画出灰色的图片,再画出彩色图片并对彩色图片进行裁剪,先初始化一些参数 private Paint mPaint = new Paint(); private Map<Integer, List<Bitmap>> bitmap = new HashMap<>(); private float needClipWidth, needClipHeight; private float maxWidth,
aruba
2020/07/03
1.3K0
Android画布Canvas裁剪效果演示--RevealView
安卓开发-车机应用实现仪表盘高级UI
在车机应用开发中,本文介绍如何在安卓平台上实现一个自定义的仪表盘视图,包括设计、实现和集成协议数据(不提供code)。
Nimyears
2024/09/04
3330
Android之Bitmap
1. Bitmap比较特别 因为其不可创建 而只能借助于BitmapFactory 而根据图像来源又可分以下几种情况:
张拭心 shixinzhang
2022/11/30
8450
简单实现满屏表情下落的动画效果,你也可以
首先我相信大家一定玩过微信吧。之前在玩微信的时候,给好友发一句“圣诞快乐”就会有满屏的圣诞树往下掉,当时觉得这个动画好酷。正好在公司的项目中需要用到这样的动画效果。于是写了一个小Demo,就有了这篇文章。
俞其荣
2022/07/28
8140
简单实现满屏表情下落的动画效果,你也可以
Android--利用camera打造3D效果
效果如下: Camera3DView.gif 思路是利用camera对两张图片分别做旋转处理,代码如下 /** * 使用camera实现3d效果的自定义控件 */ public class Cam
aruba
2020/07/02
1.1K0
android放大镜效果实现
概述 我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析。 源码分析 public class ShaderView ex
xiangzhihong
2018/01/30
2.4K0
android放大镜效果实现
Android绘图Canvas十八般武器之Shader详解及实战篇(下)
上一篇《Android绘图Canvas十八般武器之Shader篇(上)》 我们知道了Bitmap的用法,及TileMode的详细情况。接下来,这一篇作为整个知识体系的下半部要讲的是Shader的其它几个子类。 首先声明,网上很多称之为渲染,如图形渲染,线性渲染等,而在这里我更喜欢称为渐变。
Frank909
2019/01/14
1.4K0
Android利用SRC_OUT模式下的Xfermode实现刮刮卡效果
和橡皮擦相同,只是在最下层加一个显示结果的图片 private Bitmap bitmapRes, bitmapSrc, bitmapDst; private Paint mPaint = new Paint(); private Paint pathPaint = new Paint(); private Path path = new Path(); //透明画布 private Canvas dstCanvas; public Guaguak
aruba
2020/07/02
8080
Android利用SRC_OUT模式下的Xfermode实现刮刮卡效果
视频直播系统源码,图片叠加
Coffee-Phone_N9pYOsdDIUB5.jpeg package com.zmlxj.customcompass; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import
yunbaokeji柯基
2020/10/27
1.7K0
视频直播系统源码,图片叠加
Android自定义View【实战教程】5⃣️---Canvas详解及代码绘制安卓机器人
Android自定义View【实战教程】3⃣️—-Paint类、Path类以及PathEffect类详解
先知先觉
2019/01/21
1.4K0
Android放大镜的实现 博客分类: Android Android
快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。     去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。
chroya
2018/10/31
1.3K0
android 渐变透明、伸缩、平移、旋转动画效果
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.KeyEvent; import android.view.View; imp
用户7999227
2021/09/22
1.7K0
Android粒子篇之Bitmap像素级操作
零、前言 1.粒子效果的核心有三个点:收集粒子、更改粒子、显示粒子 2.Bitmap的可以获取像素,从而得到每个像素的颜色值 3.可以通过粒子拼合一张图片,并对粒子操作完成很多意想不到的效果 4.本项目源码见文尾捷文规范第一条,文件为BitmapSplitView.java ---- 一、初识 1.什么是Bitmap像素级的操作: 相信大家都知道一张jpg或png放大后会是一个个小格子,称为一个像素(px),而且一个小格子是一种颜色 也就是一张jpg或png图片就是很多颜色的合集,而这些合集
张风捷特烈
2018/12/14
1.8K0
Android项目实战(二十三):仿QQ设置App全局字体大小
一、项目需求: 因为产品对象用于中老年人,所以产品设计添加了APP全局字体调整大小功能。 这里仿做QQ设置字体大小的功能。 QQ实现的效果是,滚动下面的seekbar,当只有seekbar到达某一个刻
听着music睡
2018/05/18
2.4K0
Android利用SRC_IN模式下的Xfermode实现图片倒影效果
private Bitmap bitmapSrc; private Bitmap bitmapDst; private Paint mPaint = new Paint(); 初始化参数 public InvertImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); set
aruba
2020/07/03
9130
Android利用SRC_IN模式下的Xfermode实现图片倒影效果
快给你的app上锁吧(android图案解锁)
思路 这里又是一个九宫格布局,布局可以参考上一篇快给你的app上锁吧(android数字解锁),只不过这里的九宫格上我们画的是图片(bitmap)。onDraw方法中我们需要画两个东西,一个是点,另一个是线,画点我们就不多说了,根据坐标,将圆形图片画上去即可;
用户2802329
2018/08/07
1.3K0
快给你的app上锁吧(android图案解锁)
相关推荐
Android画布Canvas裁剪效果演示--RevealView
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文