当前位置:   article > 正文

自定义人脸识别动画效果_jq中自定义人脸识别动画效果

jq中自定义人脸识别动画效果

目录

效果展示

实现步骤

1.绘制圆圈遮罩

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

  1. /**
  2. * 绘制圆圈遮罩
  3. * @param canvas
  4. */
  5. private void drawCircleMask(Canvas canvas) {
  6. canvas.save();
  7. //目标图Dst
  8. canvas.drawRect(new Rect(0,0,getWidth(),getHeight()), mPaint);
  9. //设置混合模式
  10. mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
  11. //源图Src,重叠区域右下角部分
  12. canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 3, mPaint);
  13. //清除混合模式
  14. mPaint.setXfermode(null);
  15. canvas.restore();
  16. }

这时效果如下:

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

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

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

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

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

  1. /**
  2. * 画圆圈外部的圆圈图片
  3. */
  4. private void drawBitmapCircle(Canvas canvas) {
  5. if(mInnerCircleBitmap == null){
  6. int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);
  7. mInnerCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_innercircle);
  8. mInnerCircleBitmap = Bitmap.createScaledBitmap(mInnerCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);
  9. }
  10. if(mOutCircleBitmap == null){
  11. int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);
  12. mOutCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_outcircle);
  13. mOutCircleBitmap = Bitmap.createScaledBitmap(mOutCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);
  14. }
  15. int left = (getWidth() - mInnerCircleBitmap.getWidth()) / 2;
  16. int top = (int) (getWidth() / 2 - getWidth() / 3 - getWidth() / 1.5f / 8);
  17. canvas.drawBitmap(mInnerCircleBitmap,left,top,mPaint);
  18. canvas.drawBitmap(mOutCircleBitmap,left,top,mPaint);
  19. }

这时效果如下:

3.实现旋转动画效果

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

  1. private float mDegress = 0;//旋转角度
  2. private void init() {
  3. //定义动画
  4. valueAnimator = ValueAnimator.ofFloat(0f, 360f);
  5. valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
  6. valueAnimator.setRepeatMode(ValueAnimator.RESTART);
  7. valueAnimator.setInterpolator(new LinearInterpolator());
  8. valueAnimator.setDuration(6000);
  9. valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  10. @Override
  11. public void onAnimationUpdate(ValueAnimator animation) {
  12. mDegress = (float) animation.getAnimatedValue();
  13. postInvalidate();
  14. }
  15. });
  16. valueAnimator.start();
  17. }
  18. /**
  19. * 画圆圈外部的圆圈图片
  20. */
  21. private void drawBitmapCircle(Canvas canvas) {
  22. if(mInnerCircleBitmap == null){
  23. int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);
  24. mInnerCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_innercircle);
  25. mInnerCircleBitmap = Bitmap.createScaledBitmap(mInnerCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);
  26. }
  27. if(mOutCircleBitmap == null){
  28. int dstWidthAndHeight = (int) (getWidth() / 1.5f + getWidth() / 1.5f / 4);
  29. mOutCircleBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_checkface_outcircle);
  30. mOutCircleBitmap = Bitmap.createScaledBitmap(mOutCircleBitmap,dstWidthAndHeight,dstWidthAndHeight,true);
  31. }
  32. int left = (getWidth() - mInnerCircleBitmap.getWidth()) / 2;
  33. int top = (int) (getWidth() / 2 - getWidth() / 3 - getWidth() / 1.5f / 8);
  34. //顺时针旋转
  35. canvas.save();
  36. canvas.rotate(mDegress,getWidth() / 2, getWidth() / 2);
  37. canvas.drawBitmap(mInnerCircleBitmap,left,top,mPaint);
  38. canvas.restore();
  39. //逆时针旋转
  40. canvas.save();
  41. canvas.rotate(-mDegress,getWidth() / 2, getWidth() / 2);
  42. canvas.drawBitmap(mOutCircleBitmap,left,top,mPaint);
  43. canvas.restore();
  44. }

这时效果如下:

4.增加提示文字

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

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

最终效果如下:

案例源码

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/873421
推荐阅读
相关标签
  

闽ICP备14008679号