Android加载动画系列——BlockLoadingAnim

Android加载动画系列——BlockLoadingAnim

俄罗斯方块,我相信80、90的人肯定玩过,也差不多快被这个时代忘记了,或者说被一些新的玩法替代了,比如:体感俄罗斯方块。今天我们就来实现一款带阴影的方块加载动画~

让我们先来看看效果图:


1、BlockLoadingAnim.java源码如下:

public class BlockLoadingAnim extends View{

    private Paint mPaint, mPaintShadow, mPaintLeft, mPaintRight;
    private float mWidth = 0f;
    float moveYtoCenter= 0f;
    float rhomboidsX= 0f;
    float rhomboidsY= 0f;

    public BlockLoadingAnim(Contextcontext) {
        this(context,null);
    }

    public BlockLoadingAnim(Contextcontext, AttributeSet attrs) {
        this(context,attrs, 0);
    }

    public BlockLoadingAnim(Contextcontext, AttributeSet attrs, int defStyleAttr) {
        super(context,attrs, defStyleAttr);
        initPaint();
    }


    @Override
   
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec,heightMeasureSpec);

        if (getMeasuredWidth()> getHeight())
            mWidth =getMeasuredHeight();
        else
           
mWidth
=getMeasuredWidth();
        rhomboidsX = (float) (3 * mWidth / 16 / Math.sqrt(3));
        rhomboidsY = mWidth / 16;

    }

    @Override
   
protected void onDraw(Canvascanvas) {
        super.onDraw(canvas);
        canvas.save();
        if (!mShadow) {
            moveYtoCenter = mWidth / 4;
        } else {
            moveYtoCenter =0;
        }
        if (mAnimatedValue>= 0 && mAnimatedValue < (1.0f / 3)) {
            drawStep1(canvas, mAnimatedValue);
            if (mShadow)
                drawShadowStep1(canvas, mAnimatedValue);
        } else if (mAnimatedValue>= (1.0f / 3) && mAnimatedValue< (1.0f / 3 * 2)) {
            drawStep2(canvas, mAnimatedValue);
            if (mShadow)
                drawShadowStep2(canvas, mAnimatedValue);
        } else if (mAnimatedValue>= (1.0f / 3 * 2)&& mAnimatedValue <= 1.0f) {
            drawStep3(canvas, mAnimatedValue);
            if (mShadow)
                drawShadowStep3(canvas, mAnimatedValue);
        }
        canvas.restore();

    }

    private void drawStep1(Canvascanvas, float time) {


        float moveX = rhomboidsX/ 2.0f * time / (1.0f / 3);
        float moveY = rhomboidsY/ 2.0f * time / (1.0f / 3);

        Path p = new Path();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - moveX, rhomboidsY * 12 - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- moveX, rhomboidsY * 11 - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - moveX, mWidth / 4 * 3 - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- moveX, rhomboidsY * 13 - moveY -mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - moveX, rhomboidsY * 12 - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- moveX, rhomboidsY * 13 - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- moveX, rhomboidsY * 13 - moveY -mWidth / 2 + rhomboidsY * 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 - moveX, rhomboidsY * 12 - moveY -mWidth / 2 + rhomboidsY * 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + moveX, rhomboidsY * 12 - rhomboidsY+ moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + moveX, rhomboidsY * 11 - rhomboidsY+ moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ moveX, mWidth / 4 * 3 - rhomboidsY+ moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + moveX, rhomboidsY * 13 - rhomboidsY+ moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + moveX, rhomboidsY* 12 + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 11 + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + moveX, mWidth / 4 * 3 + moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 13 + moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + moveX, rhomboidsY* 12 + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 13 + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 13 + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + moveX, rhomboidsY* 12 + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);


        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX+ rhomboidsX + moveX, mWidth / 4 * 3 + moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 13 + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 13 + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + moveX, mWidth / 4 * 3 + moveY -mWidth / 2 + rhomboidsY * 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - moveX, rhomboidsY * 12 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 11 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 13 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - moveX, rhomboidsY * 12 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 13 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 13 + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - moveX, rhomboidsY * 12 + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);


        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 13 + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 13 + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);


    }


    private void drawStep2(Canvascanvas, float time) {




        float moveX = rhomboidsX* (time - 1.0f / 3) / (1.0f / 3);
        float moveY = rhomboidsY* (time - 1.0f / 3) / (1.0f / 3);

        Path p = new Path();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + moveX, rhomboidsY* 12 - rhomboidsY / 2.0f - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + moveX, rhomboidsY* 11 - rhomboidsY / 2.0f - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX/ 2.0f + moveX, mWidth / 4 * 3 - rhomboidsY/ 2.0f - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY / 2.0f - moveY -mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + moveX, rhomboidsY* 12 - rhomboidsY / 2.0f - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY / 2.0f - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY / 2.0f - moveY -mWidth / 2 + rhomboidsY * 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + moveX, rhomboidsY* 12 - rhomboidsY / 2.0f - moveY -mWidth / 2 + rhomboidsY * 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 12 - rhomboidsY + rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 11 - rhomboidsY + rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);

        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);

        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 11 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX- rhomboidsX / 2.0f, mWidth / 4 * 3 + rhomboidsY- rhomboidsY / 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);

        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX- rhomboidsX / 2.0f, mWidth / 4 * 3 + rhomboidsY- rhomboidsY / 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX- rhomboidsX / 2.0f, mWidth / 4 * 3 + rhomboidsY- rhomboidsY / 2.0f - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 12 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 11 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 13 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);

        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 12 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 13 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 13 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 12 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);

        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 13 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 13 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);

    }


    private void drawStep3(Canvascanvas, float time) {




        float moveX = rhomboidsX/ 2.0f * (time - 1.0f / 3 * 2) / (1.0f / 3);
        float moveY = rhomboidsY/ 2.0f * (time - 1.0f / 3 * 2) / (1.0f / 3);

        Path p = new Path();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 12 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 11 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX/ 2.0f + rhomboidsX + moveX, mWidth / 4 * 3 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 13 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 12 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 13 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 13 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 12 - rhomboidsY/ 2.0f - rhomboidsY + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 12 - rhomboidsY + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 11 - rhomboidsY + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f + moveX, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f + moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f + moveX, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f + moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f + moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f + moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f + moveX, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f + moveY -mWidth / 2 + rhomboidsY * 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 12 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 11 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + rhomboidsY - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 13 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 12 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 13 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 13 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 12 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);

        p.reset();
        p.moveTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + rhomboidsY - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 13 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 13 + rhomboidsY / 2.0f + rhomboidsY- moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + rhomboidsY - moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintRight);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 11 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + rhomboidsX- rhomboidsX / 2.0f - moveX, mWidth / 4 * 3 + rhomboidsY- rhomboidsY / 2.0f - moveY -mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaint);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.lineTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - moveY - mWidth / 2 + rhomboidsY* 2 + moveYtoCenter);
        p.close();
        canvas.drawPath(p, mPaintLeft);


    }


    private void drawShadowStep1(Canvascanvas, float time) {




        float moveX = rhomboidsX/ 2.0f * time / (1.0f / 3);
        float moveY = rhomboidsY/ 2.0f * time / (1.0f / 3);

        Path p = new Path();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - moveX, rhomboidsY * 12 - moveY);
        p.lineTo(mWidth / 2 - rhomboidsX- moveX, rhomboidsY * 11 - moveY);
        p.lineTo(mWidth / 2 - moveX, mWidth / 4 * 3 - moveY);
        p.lineTo(mWidth / 2 - rhomboidsX- moveX, rhomboidsY * 13 - moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + moveX, rhomboidsY * 12 - rhomboidsY+ moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + moveX, rhomboidsY * 11 - rhomboidsY+ moveY);
        p.lineTo(mWidth / 2 + rhomboidsX+ moveX, mWidth / 4 * 3 - rhomboidsY+ moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + moveX, rhomboidsY * 13 - rhomboidsY+ moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + moveX, rhomboidsY* 12 + moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 11 + moveY);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + moveX, mWidth / 4 * 3 + moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + moveX, rhomboidsY* 13 + moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - moveX, rhomboidsY * 12 + rhomboidsY- moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 11 + rhomboidsY- moveY);
        p.lineTo(mWidth / 2 + rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY- moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - moveX, rhomboidsY * 13 + rhomboidsY- moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);
    }


    private void drawShadowStep2(Canvascanvas, float time) {

        float moveX = rhomboidsX* (time - 1.0f / 3) / (1.0f / 3);
        float moveY = rhomboidsY* (time - 1.0f / 3) / (1.0f / 3);

        Path p = new Path();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + moveX, rhomboidsY* 12 - rhomboidsY / 2.0f - moveY);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + moveX, rhomboidsY* 11 - rhomboidsY / 2.0f - moveY);
        p.lineTo(mWidth / 2 - rhomboidsX/ 2.0f + moveX, mWidth / 4 * 3 - rhomboidsY/ 2.0f - moveY);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY / 2.0f - moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 12 - rhomboidsY + rhomboidsY/ 2.0f);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 11 - rhomboidsY + rhomboidsY/ 2.0f);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 12 + rhomboidsY/ 2.0f + moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 11 + rhomboidsY/ 2.0f + moveY);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - moveX, rhomboidsY * 13 + rhomboidsY/ 2.0f + moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 11 + rhomboidsY - rhomboidsY/ 2.0f);
        p.lineTo(mWidth / 2 + rhomboidsX- rhomboidsX / 2.0f, mWidth / 4 * 3 + rhomboidsY- rhomboidsY / 2.0f);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f);
        p.close();
        canvas.drawPath(p, mPaintShadow);
    }


    private void drawShadowStep3(Canvascanvas, float time) {



        float moveX = rhomboidsX/ 2.0f * (time - 1.0f / 3 * 2) / (1.0f / 3);
        float moveY = rhomboidsY/ 2.0f * (time - 1.0f / 3 * 2) / (1.0f / 3);

        Path p = new Path();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 - rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 12 - rhomboidsY/ 2.0f - rhomboidsY + moveY);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 11 - rhomboidsY/ 2.0f - rhomboidsY + moveY);
        p.lineTo(mWidth / 2 - rhomboidsX/ 2.0f + rhomboidsX + moveX, mWidth / 4 * 3 - rhomboidsY/ 2.0f - rhomboidsY + moveY);
        p.lineTo(mWidth / 2 - rhomboidsX- rhomboidsX / 2.0f + rhomboidsX+ moveX, rhomboidsY * 13 - rhomboidsY/ 2.0f - rhomboidsY + moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 12 - rhomboidsY + rhomboidsY/ 2.0f + moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 11 - rhomboidsY + rhomboidsY/ 2.0f + moveY);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX / 2.0f + moveX, mWidth / 4 * 3 - rhomboidsY+ rhomboidsY / 2.0f + moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f + moveX, rhomboidsY* 13 - rhomboidsY + rhomboidsY/ 2.0f + moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 12 + rhomboidsY / 2.0f + rhomboidsY- moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 11 + rhomboidsY / 2.0f + rhomboidsY- moveY);
        p.lineTo(mWidth / 2 + rhomboidsX+ rhomboidsX + rhomboidsX / 2.0f - rhomboidsX- moveX, mWidth / 4 * 3 + rhomboidsY/ 2.0f + rhomboidsY - moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX + rhomboidsX + rhomboidsX/ 2.0f - rhomboidsX - moveX, rhomboidsY* 13 + rhomboidsY / 2.0f + rhomboidsY- moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


        p.reset();
        p.moveTo(mWidth / 2 - rhomboidsX* 2 + rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 12 + rhomboidsY - rhomboidsY/ 2.0f - moveY);
        p.lineTo(mWidth / 2 - rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 11 + rhomboidsY - rhomboidsY/ 2.0f - moveY);
        p.lineTo(mWidth / 2 + rhomboidsX- rhomboidsX / 2.0f - moveX, mWidth / 4 * 3 + rhomboidsY- rhomboidsY / 2.0f - moveY);
        p.lineTo(mWidth / 2 + -rhomboidsX+ rhomboidsX - rhomboidsX / 2.0f - moveX, rhomboidsY* 13 + rhomboidsY - rhomboidsY/ 2.0f - moveY);
        p.close();
        canvas.drawPath(p, mPaintShadow);


    }


    private void initPaint(){
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setColor(Color.rgb(247, 202, 42));
        mPaint.setStrokeWidth(1);
        mPaintShadow = new Paint();
        mPaintShadow.setAntiAlias(true);
        mPaintShadow.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaintShadow.setColor(Color.rgb(0, 0, 0));
        mPaintShadow.setStrokeWidth(1f);
        mPaintLeft = new Paint();
        mPaintLeft.setAntiAlias(true);
        mPaintLeft.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaintLeft.setColor(Color.rgb(227, 144, 11));
        mPaintLeft.setStrokeWidth(1);
        mPaintRight = new Paint();
        mPaintRight.setAntiAlias(true);
        mPaintRight.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaintRight.setColor(Color.rgb(188, 91, 26));
        mPaintRight.setStrokeWidth(1);
    }


    private ValueAnimatorvalueAnimator;
    float mAnimatedValue= 0;

    public void startAnim(){
        stopAnim();
        startViewAnim(0f, 1f, 500);
    }


    public void stopAnim(){
        if (valueAnimator!= null) {
            clearAnimation();
            valueAnimator.setRepeatCount(0);
            valueAnimator.cancel();
            valueAnimator.end();
            mAnimatedValue = 0f;
            postInvalidate();
        }
    }


    private ValueAnimatorstartViewAnim(float startF, final float endF, long time) {
        valueAnimator =ValueAnimator.ofFloat(startF, endF);
        valueAnimator.setDuration(time);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环
       
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
            @Override
           
public void onAnimationUpdate(ValueAnimatorvalueAnimator) {
                mAnimatedValue= (float) valueAnimator.getAnimatedValue();

                invalidate();
            }
        });
        valueAnimator.addListener(new AnimatorListenerAdapter(){
            @Override
           
public void onAnimationEnd(Animatoranimation) {
                super.onAnimationEnd(animation);

            }

            @Override
           
public void onAnimationStart(Animatoranimation) {
                super.onAnimationStart(animation);
            }

            @Override
           
public void onAnimationRepeat(Animatoranimation) {
                super.onAnimationRepeat(animation);
            }
        });
        if (!valueAnimator.isRunning()){
            valueAnimator.start();

        }

        return valueAnimator;
    }

    private boolean mShadow= true;

    public void isShadow(boolean show) {

        this.mShadow= show;
        invalidate();
    }


}

 

2、接着在layout布局文件中使用我们自定义的动画控件

 

   <com.cyril.loadinganim.BlockLoadingAnim
    android:id="@+id/blockloadinganim"
    android:layout_width="50dp"
    android:layout_height="50dp"
     />

 

3、然后在Activity中实现动画的播放和停止,使用事例如下:

blockLoadingAnim = (BlockLoadingAnim) findViewById(R.id.blockloadinganim);
blockLoadingAnim.isShadow(true);
blockLoadingAnim.startAnim();
 
我们可以通过isShadow(false)方法来关闭底部阴影的效果。
 

4、  戳这里,小编带你去源码的下载地址:http://download.csdn.net/detail/zhimingshangyan/9582830

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值