美文网首页
属性动画 - 花束直播加载效果

属性动画 - 花束直播加载效果

作者: cao苗子 | 来源:发表于2019-08-26 13:52 被阅读0次

1.先看效果吧

花束直播加载效果.gif

看这个效果其实是很简单的,主要是练习属性动画。下面直接看代码吧

2.先看CIrcleView的代码

package com.miaozi.loadingview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * created by panshimu
 * on 2019/8/26
 */
public class CircleView extends View {
    private Paint mPaint;
    private int mColor;
    public CircleView(Context context) {
        this(context,null);
    }

    public CircleView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initLayout();
    }

    private void initLayout() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawCircle(getHeight()/2,getHeight()/2,getHeight()/2,mPaint);
    }
    public void setColor(int color){
        mPaint.setColor(color);
        mColor = color;
        invalidate();
    }
    public int getColor(){
        return mColor;
    }
}

这里就是自定义一个圆。

3.LoadingView合并三个CircleView

LoadingView就是一个RelativeLayout,里面有三个CircleView,中间一个在最上面。它的下面是两个,然后往两边移动就可以了。

package com.miaozi.loadingview;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.RelativeLayout;

/**
 * created by panshimu
 * on 2019/8/26
 */
public class LoadingView extends RelativeLayout {
    private int mCircleRadius = 25;
    private CircleView mLeftCircle;
    private CircleView mCenterCircle;
    private CircleView mRightCircle;
    private int mDuration = 350;
    private AnimatorSet mLeftAnimatorSet;
    private AnimatorSet mRightAnimatorSet;
    private int mTranslationX = 100;
    private boolean isAnimation = false;

    public LoadingView(Context context) {
        this(context,null);
    }

    public LoadingView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initLayout();
        post(new Runnable() {
            @Override
            public void run() {
                isAnimation = true;
                startLeftAnimation();
            }
        });
    }

    private void initLayout() {

        mLeftCircle = new CircleView(getContext());
        mLeftCircle.setColor(Color.RED);
        RelativeLayout.LayoutParams leftCircleParams = new RelativeLayout.LayoutParams(mCircleRadius,mCircleRadius);
        mLeftCircle.setLayoutParams(leftCircleParams);
        addView(mLeftCircle);

        mRightCircle = new CircleView(getContext());
        mRightCircle.setColor(Color.YELLOW);
        RelativeLayout.LayoutParams rightCircleParams = new RelativeLayout.LayoutParams(mCircleRadius,mCircleRadius);
        mRightCircle.setLayoutParams(rightCircleParams);
        addView(mRightCircle);

        mCenterCircle = new CircleView(getContext());
        mCenterCircle.setColor(Color.BLUE);
        RelativeLayout.LayoutParams centerCircleParams = new RelativeLayout.LayoutParams(mCircleRadius,mCircleRadius);
        mCenterCircle.setLayoutParams(centerCircleParams);
        addView(mCenterCircle);

    }

    private void startLeftAnimation(){

        Log.d("TAG","startLeftAnimation");
        if(mLeftAnimatorSet == null) {
            ObjectAnimator leftAnimation = ObjectAnimator.ofFloat(mLeftCircle, "translationX", 0, mTranslationX - mCircleRadius);
            ObjectAnimator rightAnimation = ObjectAnimator.ofFloat(mRightCircle, "translationX", 0, -(mTranslationX - mCircleRadius));
            mLeftAnimatorSet = new AnimatorSet();
            mLeftAnimatorSet.playTogether(leftAnimation, rightAnimation);
            mLeftAnimatorSet.setDuration(mDuration);
            mLeftAnimatorSet.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    if(isAnimation) {
                        startRightAnimation();
                    }
                }
            });
        }
        mLeftAnimatorSet.start();

    }
    private void startRightAnimation(){
        Log.d("TAG","startRightAnimation");
        if(mRightAnimatorSet == null) {
            ObjectAnimator leftAnimation = ObjectAnimator.ofFloat(mLeftCircle, "translationX", mTranslationX - mCircleRadius, 0);
            ObjectAnimator rightAnimation = ObjectAnimator.ofFloat(mRightCircle, "translationX", -(mTranslationX - mCircleRadius), 0);
            mRightAnimatorSet = new AnimatorSet();
            mRightAnimatorSet.playTogether(leftAnimation, rightAnimation);
            mRightAnimatorSet.setDuration(mDuration);
            mRightAnimatorSet.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    if(isAnimation) {
                        setColor(mLeftCircle);
                        setColor(mRightCircle);
                        setColor(mCenterCircle);
                        startLeftAnimation();
                    }
                }
            });
        }
        mRightAnimatorSet.start();
    }

    public void show(){
        if(getVisibility() == GONE) {
            setVisibility(VISIBLE);
            isAnimation = true;
            startLeftAnimation();
        }
    }
    public void hide(){
        if(getVisibility() == VISIBLE) {
            isAnimation = false;
            setVisibility(GONE);
        }
    }

    private void setColor(CircleView circleView){
        switch (circleView.getColor()){
            case Color.RED:
                circleView.setColor(Color.YELLOW);
                break;
            case Color.YELLOW:
                circleView.setColor(Color.BLUE);
                break;
            case Color.BLUE:
                circleView.setColor(Color.RED);
                break;
        }
    }
}

不断的切换颜色就可以了。根据项目的需求在修改,或是修改颜色变化的规则等等
源码地址是:
https://github.com/panshimu/LoadingView

有问题请留言,谢谢!

QQ: 362976241

相关文章

网友评论

      本文标题:属性动画 - 花束直播加载效果

      本文链接:https://www.haomeiwen.com/subject/onvrectx.html