高仿支付宝指纹扫描动画

最近项目中遇到指纹支付的需求,有个扫指纹的动画需求

效果图


实现原理

需要重写View,在onDraw方法中完成绘制,使用canvas的drawBitmap方法:

drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint);

第一个Rect 代表要绘制的bitmap 区域,第二个 Rect 代表的是要将bitmap 绘制在屏幕的什么地方

首先,在构造函数中,初始化bitmap,paint:

mFingerGreen= ((BitmapDrawable) ContextCompat.getDrawable(mContext,R.drawable.finger_green)).getBitmap();

mFingerGrey= ((BitmapDrawable) ContextCompat.getDrawable(mContext,R.drawable.finger_grey)).getBitmap();

mLine= ((BitmapDrawable) ContextCompat.getDrawable(mContext,R.drawable.finger_line)).getBitmap();

mBitWidth=mFingerGreen.getWidth();

mBitHeight=mFingerGreen.getHeight();

mBitPaint=newPaint();

// 防抖动

mBitPaint.setDither(true);

// 开启图像过滤

mBitPaint.setFilterBitmap(true);

mSrcRect=newRect();

mDestRect=newRect();

在onDraw(Canvas canvas)方法绘制图片

@Override

protected voidonDraw(Canvas canvas) {

super.onDraw(canvas);

//显示在view中间

inthalfViewWidth =mWidth/2;

inthalfViewHeight =mHeight/2;

intleft =0;

inttop =0;

mBitPaint.setAlpha(255);

mSrcRect.set(left,top,mBitWidth,mBitHeight);

left = halfViewWidth -mFingerGrey.getWidth() /2;

top = halfViewHeight -mFingerGrey.getHeight() /2;

mDestRect.set(left,top,mBitWidth+ left,mBitHeight+ top);

canvas.drawBitmap(mFingerGrey,mSrcRect,mDestRect,mBitPaint);//画灰色底图

left =0;

top =0;

mSrcRect.set(left,top,mBitWidth,(int) (mBitHeight*mFraction));

left = halfViewWidth -mFingerGreen.getWidth() /2;

top = halfViewHeight -mFingerGreen.getHeight() /2;

mDestRect.set(left,top,mBitWidth+ left,(int) (mBitHeight*mFraction) + top);

canvas.drawBitmap(mFingerGreen,mSrcRect,mDestRect,mBitPaint);//画绿色图片

left = halfViewWidth -mLine.getWidth() /2;

canvas.drawBitmap(mLine,left,mDestRect.bottom,mBitPaint);//画线

}

最后,利用ValueAnimator,修改mFraction的值,得到每次移动的步长,invalidate()重新绘画。

public voidstartScaning() {

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.f,100.f);

valueAnimator.setDuration(1000);

valueAnimator.setInterpolator(newLinearInterpolator());

valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {

@SuppressLint("NewApi")

@Override

public voidonAnimationUpdate(ValueAnimator valueAnimator) {

mFraction= valueAnimator.getAnimatedFraction();

invalidate();

}

});

valueAnimator.addListener(newAnimator.AnimatorListener() {

@Override

public voidonAnimationStart(Animator animator) {

}

@Override

public voidonAnimationEnd(Animator animator) {

mFraction=0;

if(isAnim) {

startScaning();

}

}

@Override

public voidonAnimationCancel(Animator animator) {

}

@Override

public voidonAnimationRepeat(Animator animator) {

}

});

if(!valueAnimator.isRunning()) {

valueAnimator.start();

}

}

大功告成,最后附上需要的四张图片:


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • //通过获得资源文件进行设置。根据不同的情况R.color.red也可以是R.string.red或者R.draw...
    gogoingmonkey阅读 2,046评论 0 2
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,406评论 0 17
  • 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,...
    AiPuff阅读 919评论 0 1
  • 手势图片控件 PinchImageView 点击图片框架 photoView packagecom.example...
    Ztufu阅读 815评论 0 1
  • 1: 获取控件宽高 控件View有getHeight()和getwidth()方法可以获取宽高,但是如果直接在on...
    自由人是工程师阅读 2,010评论 0 0

友情链接更多精彩内容