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