如何通过动画提升支付外国人体验支付宝

自定义View系列--Path绘制仿支付宝支付成功动画
时间: 16:21:40
&&&& 阅读:114
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&前言
使用支付宝付款时,我们可以看到成功或者失败都会有个动画提示,如果我们需要做这样的效果的话,当然,你可以让设计师给你做个GIF,但是我们知道图像比较耗内存的,我们自己可以用代码实现还是代码实现好点吧。
首先我们需要了解PathMeasure这个类,这个类我们可以理解为用来管理Path。我们主要看几个方法。
PathMeasure(): 构造方法 ,实例化一个对象
PathMeasure(Path path,boolean isClosed):传入Path对象和是否闭合,path对象不能为空
getLength():获取当前轮廓、外形的总长度, 如果没有设置Path对象,返回0
getSegment(float startD,float stopD,Path dst,boolean startWithMoveTo):调用这个方法,我们可以获取到指定范围内的一段轮廓,存入到dst参数中。所以,这个方法传入的参数分别为长度起始值、结束值、装这一段路径的Path对象、是否MoveTo。另外,这个方法返回值为Boolean类型,如果getLength为0的话,返回false,或者startD & stopD,同样返回false。
setPath(Path path , boolean isClosed):给当前PathMeasure对象设置Path
nextContour():移动到下一个轮廓
然后我们需要动起来,我们知道invalidate()方法可以刷新界面,也就是重新调用onDraw()方法,所以我们要不停调用invalidate方法,在onDraw方法中改变参数,这样实现动的效果。所以可以用到刚刚介绍的getSegment方法,不断改变获取的范围,从0 * getLength,到1 * getLength,最后绘制完整。所以我们需要一个在一秒内或两秒内一个从0到1的值的变化,so,我们使用ValueAnimator这个类来实现。
mCircleAnimator = ValueAnimator.ofFloat(0, 1);
mCircleAnimator.setDuration(1000);
mCircleAnimator.start();
mCircleAnimator.addUpdateListener(this);
动画开始后,在监听方法中获取当前进度并且重绘图像
mCirclePercent = (float)animation.getAnimatedValue();
invalidate();
在onDraw方法中,绘制图像
mPathCircle.addCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - mLineWidth, Path.Direction.CW)
mPathMeasure.setPath(mPathCircle, false)
mPathMeasure.getSegment(0, mCirclePercent * mPathMeasure.getLength(), mPathCircleDst, true)
canvas.drawPath(mPathCircleDst, mPaint)
附上源码,欢迎点评
package com.mintmedical.
import android.animation.ValueA
import android.content.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.P
import android.graphics.PathM
import android.util.AttributeS
import android.util.L
import android.view.V
* Created by MooreLi on .
public class ResultAnimation extends View implements ValueAnimator.AnimatorUpdateListener {
private Context mC
* paint对象
private Paint mP
* Path和对应的空Path用来填充
private Path mPathC
private Path mPathCircleD
private Path mPathR
private Path mPathRightD
private Path mPathWrong1;
private Path mPathWrong2;
private Path mPathWrong1D
private Path mPathWrong2D
* Path管理
private PathMeasure mPathM
private ValueAnimator mCircleA
private ValueAnimator mRightA
private ValueAnimator mWrong1A
private ValueAnimator mWrong2A
* 当前绘制进度占总Path长度百分比
private float mCircleP
private float mRightP
private float mWrong1P
private float mWrong2P
private int mLineW
* 正确动画 错误动画
public static final int RESULT_RIGHT = 1;
public static final int RESULT_WRONG = 2;
* 当前结果类型
private int mResultType = RESULT_WRONG;
public ResultAnimation(Context context) {
super(context);
mContext =
public ResultAnimation(Context context, AttributeSet attrs) {
super(context, attrs);
mContext =
public ResultAnimation(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext =
private void init() {
mLineWidth = dp2px(3);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mLineWidth);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.GREEN);
initPath();
private void initPath() {
mPathCircle = new Path();
mPathCircleDst = new Path();
mPathRight = new Path();
mPathRightDst = new Path();
mPathWrong1 = new Path();
mPathWrong2 = new Path();
mPathWrong1Dst = new Path();
mPathWrong2Dst = new Path();
mPathMeasure = new PathMeasure();
mCircleAnimator = ValueAnimator.ofFloat(0, 1);
mCircleAnimator.setDuration(1000);
mCircleAnimator.start();
mCircleAnimator.addUpdateListener(this);
mRightAnimator = ValueAnimator.ofFloat(0, 1);
mRightAnimator.setDuration(500);
mRightAnimator.addUpdateListener(this);
mWrong1Animator = ValueAnimator.ofFloat(0, 1);
mWrong1Animator.setDuration(300);
mWrong1Animator.addUpdateListener(this);
mWrong2Animator = ValueAnimator.ofFloat(0, 1);
mWrong2Animator.setDuration(300);
mWrong2Animator.addUpdateListener(this);
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mResultType == RESULT_RIGHT) {
mPaint.setColor(Color.GREEN);
mPaint.setColor(Color.RED);
mPathCircle.addCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - mLineWidth, Path.Direction.CW);
mPathMeasure.setPath(mPathCircle, false);
mPathMeasure.getSegment(0, mCirclePercent * mPathMeasure.getLength(), mPathCircleDst, true);
canvas.drawPath(mPathCircleDst, mPaint);
if (mResultType == RESULT_RIGHT) {
mPathRight.moveTo(getWidth() / 4, getWidth() / 2);
mPathRight.lineTo(getWidth() / 2, getWidth() / 4 * 3);
mPathRight.lineTo(getWidth() / 4 * 3, getWidth() / 4);
if (mCirclePercent == 1) {
mPathMeasure.nextContour();
mPathMeasure.setPath(mPathRight, false);
mPathMeasure.getSegment(0, mRightPercent * mPathMeasure.getLength(), mPathRightDst, true);
canvas.drawPath(mPathRightDst, mPaint);
mPathWrong1.moveTo(getWidth() / 4 * 3, getWidth() / 4);
mPathWrong1.lineTo(getWidth() / 4, getWidth() / 4 * 3);
mPathWrong2.moveTo(getWidth() / 4, getWidth() / 4);
mPathWrong2.lineTo(getWidth() / 4 * 3, getWidth() / 4 * 3);
if (mCirclePercent == 1) {
mPathMeasure.nextContour();
mPathMeasure.setPath(mPathWrong1, false);
mPathMeasure.getSegment(0, mWrong1Percent * mPathMeasure.getLength(), mPathWrong1Dst, true);
canvas.drawPath(mPathWrong1Dst, mPaint);
if (mWrong1Percent == 1) {
mPathMeasure.nextContour();
mPathMeasure.setPath(mPathWrong2, false);
mPathMeasure.getSegment(0, mWrong2Percent * mPathMeasure.getLength(), mPathWrong2Dst, true);
canvas.drawPath(mPathWrong2Dst, mPaint);
private int dp2px(int dp) {
float scale = mContext.getResources().getDisplayMetrics().
return (int) (scale * dp + 0.5f);
public void onAnimationUpdate(ValueAnimator animation) {
if (animation.equals(mCircleAnimator)) {
mCirclePercent = (float) animation.getAnimatedValue();
invalidate();
Log.e("TEST","percent:"+mCirclePercent);
if (mCirclePercent == 1) {
if (mResultType == RESULT_RIGHT)
mRightAnimator.start();
mWrong1Animator.start();
else if (animation.equals(mRightAnimator)) {
mRightPercent = (float) animation.getAnimatedValue();
invalidate();
else if (animation.equals(mWrong1Animator)) {
mWrong1Percent = (float) animation.getAnimatedValue();
invalidate();
if (mWrong1Percent == 1) {
mWrong2Animator.start();
else if (animation.equals(mWrong2Animator)) {
mWrong2Percent = (float) animation.getAnimatedValue();
invalidate();
public void setmResultType(int mResultType) {
this.mResultType = mResultT
invalidate();
* 固定写死了宽高,可重新手动调配
* widthMeasureSpec
* heightMeasureSpec
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(dp2px(50), dp2px(50));
github地址
欢迎star与fork~
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!使用转场动画提升支付用户体验
扫描,分享朋友圈
这个地方所用的动画并不是单纯的愉悦用户,更重要的目的是让用户明白这个环节是会发生什么,并且如何高效地使用这一产品。如果这个环节缺少动画会令人感到缺点儿什么,那么这个动画是成功的。如果移除了动画,用户觉得照样可以凑合着用,则意味着这个动画是可有可无的。
作为Stripe Checkout这一支付应用的设计团队,我们在移动支付的体验设计上进行了大量的探索,也耗费了巨量的时间经历。对于支付环节的动画设计,我们有着深入的理解。在着手设计Stripe Checkout的第一天,我们就开始专注于使用转场动画来强化交互,因为我们相信它会极大地提高这款支付APP的用户体验。为了展示它的运作原理,以下我将使用几个动画案例来向你说明。
上图中的转场动画足矣说明动画对于用户的实用性。点击“Remenber me”的选框,输入联系方式的选框随着转场动画逐渐展开。动画的发生会强化用户清晰地意识到“单机选框”和“输入联系方式”之间是有联系的,并且是直接的因果关系。
当我们在填写表单的时候,经常容易忽略一些细小的错误,这也使得我们往往需要将可能出错的地方从头到尾都梳理一遍。然而很多时候,系统提醒我们信息错误时(尤其是在支付环节中),报错信息会让用户感到沮丧,检查的过程会令人无所适从,最终会有用户直接因此而放弃继续填写表单。小幅震动的界面,配合着错误内容的标识会明确地告诉用户,信息有误。这种类似摇头的交互行为会更加人性化,从而降低了用户流失率。
用好转场动画,可能会让用户感觉时间过的比实际的更快。谁都明白,当用户在等待的时候,时间会慢如蜗牛。可是当等待过程中有动画效果的时候,即使等待时长不会改变,人的注意力会被吸引过去,自然而然地会感觉时间一会儿就过去了。这种动画效果就是利用了人对于时间的错觉。
微妙的动画转变是我的最爱。上图中从Payment Info转换到Pay $25.00使用了轻微的色彩转变和滑动特效,提醒用户这个过程正在推进。而当支付完成之后,色彩从蓝色转为绿色,转变明显而醒目。在点击了Pay之后,伴随颜色变化的还有一个显示支付成功的短暂的动态图标,提醒用户支付完成。我特别喜欢这个设计,因为它会让用户感到支付完成的快感,让他们觉得完成支付是一件轻松愉悦的事情。
额外的设计
这一转场动画其实有点多余,因为删除它也不会影响整个操作流程,也不会影响使用体验。但是它的存在,会提升操作流程的体验。
像别人一样,我也不喜欢10年前的网站设计。但是这个转场动画会提高用户的体验,让用户感受到设计的善意,吸引用户去注意支付的细节并获取信任。
我的这些案例,都是在平时大家不太在意的细节处增加了转场动画,改善了整体的用户体验。无论你在构建怎样的应用程序,合理地使用动画效果,会让用户更明白操作的结果,改变他们对于时间的感知,并且令他们愉快。
扫描,分享朋友圈
|后参与评论
该用户邮箱不存在,请重试!
请输入密码!
资料更新成功!
还可以输入300字
您为什么要举报此信息?
其它不良信息描述
关注微信,一起数字进行时
手机扫一扫,下载数英APP
手机扫一扫,下载数英APP
Part of the DM Union后使用快捷导航没有帐号?
如何提高你的支付宝“芝麻信用”积分
摘要: 据说支付宝芝麻信用分越高,能享受的服务就越多。于是我们怀着研究微信红包的热情,研究了一些提高积分的窍门。
图片来源:华盖创意
6月6号开始,支付宝芝麻信用分会进一步扩大公测范围,将有更多的用户能使用这一 ...
6月6号开始,支付宝芝麻信用分会进一步扩大公测范围,将有更多的用户能使用这一功能。
开启过芝麻信用的小伙伴们已经知道,芝麻信用分达到一定级别之后,就能享受各种创新服务。比如可以在一嗨、神州租车等平台免押金免预授权租车;在去啊选择“信用住”,你也可以免押金,入住离店后再自动扣款。,用户只要达到一定的芝麻分(卢森堡750分、新加坡700分),就可在提交资料时免提供资产证明等一大堆证明材料。
当然,享受这些服务都有一个前提,那就是需要芝麻信用分达到一定级别以上,有的甚至需要700分以上。
那么问题来了,我们要怎样才能提高芝麻信用分呢?
界面新闻记者搜集各方资料加上亲身体验,总结出以下9大赚分攻略:
1、信用卡及时还,避免出现逾期记录。
2、力所能及的时候,多做一些社会公益,帮助他人也是帮助自己——说白了就是多用支付宝捐捐款。
3、别动不动就换电话号码,欠了电话费不想缴,四处流窜的人才喜欢这么干。
4、水电煤气费,看到催缴单后记得及时交,别仗着公共机构不敢随便拉你的闸、停你的水,断你的气就一直拖欠。
5、多做一些体现家庭责任感的事,比如关心父母、孩子、爱人,网购时别只顾自己——意思是多用用“亲密付”,多帮他人付款。
6、开信用卡、花呗等信用账户,越早用,越多用,对你芝麻信用的提升也是有好处的。
7、多交一些信用好的朋友。俗话说得好,物以类聚,人以群分,你的朋友普遍芝麻分低的话也会影响你。
8、不用疯狂“买买买”。用支付宝花钱购物只能稍许提高信用分,关系不大。
9、如果淘宝买了东西,要按时收货,及时付款!如果每次都是系统自动收货自动付款的,可能会影响信用分。
据蚂蚁金服工作人员透露,芝麻信用有一套基于大数据的复杂算法,不是哪几个因素就能简单改变。“信用不是一锤子买卖。重在长期,点滴珍贵,重在累积。”在数据面前,健忘不是理由,系统判定是无情的。
未来芝麻信用还会开放个人上传资料。资料越丰富,芝麻分作为信用状况的参考就越准确。所以,记得到时多上传些你的个人资料哦。
声明:本文搜集整理自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,请我们一起为维护良好的互联网秩序而努力,谢谢!联系方式见网站首页右下角。
刚表态过的朋友 ()
上一篇:下一篇:【动画】:一分钟看懂手机支付 - 在线观看 - 热点 - 乐视视频
& 【动画】:一分钟看懂手机支付
缓存至手机
我们对您的信息保密并不收取任何费用
转存到云盘
方式B免费发短信到手机
我们对您的信息保密并不收取任何费用
方式C下载APP到本机
-->英雄,快来抢沙发!加载中...英雄,快来抢沙发!
推荐原创人
乐视集团旗下网站
乐视网频道
乐视网旗下产品
违法和不良信息举报电话:
Copyright &
乐视视频(le.com)All rights reserved.需求发布后1小时内收到服务商响应每个需求平均有10个服务商参与95%以上的需求得到了圆满解决所有需求不向雇主收取任何佣金好的包装增加视觉销售力
帮我渲染简单的max动画,渲染1秒的动画支付30元。
有相似问题想解决?专业顾问来帮助您
发布需求, 托管赏金
匹配服务商
选择服务商,签单
服务商工作
已退款、交易失败
已投标服务商
共有4个服务商参与报价,查看更多服务商报价
参与报价,开始赚钱
提交你的报价和方案
中标后交付作品
获得任务赏金
极速:10分钟急速响应
高品质:精选服务商提供服务
放心:不满意可退款
根据浏览的需求为您推荐
交易成功的需求
三维动画制作相关需求
关注猪八戒微信

我要回帖

更多关于 外国人体验支付宝 的文章

 

随机推荐