上面是实现效果gif,下面是豆瓣App的gif录制图示::
思路(其中一种):
1、一个停止的笑脸
2、笑脸从左侧脸颊开始旋转,吸收眼睛,同时弧线变长
3、然后转圈
4、转到横向时释放眼睛,然后旋转回正
然后 动作往复循环
github :https://github.com/louisgeek/LouisDoubanLoadingView
具体见完整代码:
package com.louisgeek.louiscustomviewstudy;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import static android.content.ContentValues.TAG;
/**
* 支付宝的稍微和豆瓣有点区别,下面是仿豆瓣App加载中loading,支付宝自行调整下即可。
* Created by louisgeek on 2016/10/24.
*/
public class LikeDouBan_AlipaySmileLoadingView extends View {
private final int STATE_STOP = 0;
private final int STATE_START_LOAD = 1;
private final int STATE_LOADING = 2;
private final int STATE_END_LOADING = 3;
private final int STATE_TURN_SMILE = 4;
private int mCurrenState = STATE_STOP;
private Paint mPaint;
private int mScreenWidth, mScreenHeight, mViewWidth, mViewHeight;
private ValueAnimator mValueAnimatorStartLoad;
private ValueAnimator mValueAnimatorLoading;
private ValueAnimator mValueAnimatorTurnSmile;
private ValueAnimator mValueAnimatorEndLoading;
private ValueAnimator mValueAnimatorHoldSimle;
private float mLoadingProgress;
private float mStartLoadProgress;
private float mTurnSmileProgress;
private float mEndLoadingProgress;
private float mHoldSimleProgress;
private float mRaidus = this.dp2px(30);
private int mCircleFrameHeight = this.dp2px(10);
private int flagLoadingCount;
private int flagHoldSmileCount;
private boolean mStopLoading=true;
private int START_END_DURATION=800;
private ValueAnimator.AnimatorListener mAnimatorListener;
public LikeDouBan_AlipaySmileLoadingView(Context context) {
this(context, null);
}
public LikeDouBan_AlipaySmileLoadingView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LikeDouBan_AlipaySmileLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setStrokeWidth(mCircleFrameHeight);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
mPaint.setColor(Color.parseColor("#2d832e"));
mPaint.setStrokeCap(Paint.Cap.ROUND);
mAnimatorListener = new Animator.AnimatorListener() {
@Override
public<