package com.videogo.widget.loading;
|
|
import android.content.Context;
|
import android.graphics.Bitmap;
|
import android.graphics.BitmapFactory;
|
import android.graphics.Canvas;
|
import android.graphics.Paint;
|
import android.util.AttributeSet;
|
import android.view.View;
|
|
import com.videogo.util.Utils;
|
|
import ezviz.ezopensdk.R;
|
|
public class LoadingView extends View {
|
|
private long mTimeMillis;
|
private long mDuration = 2400;
|
|
private Bitmap[] mBalls;
|
private int mSquareTrackLength;
|
private int mBallSize;
|
private Paint mBallPaint;
|
|
private int mCenterX;
|
private int mCenterY;
|
|
public LoadingView(Context context) {
|
this(context, null);
|
}
|
|
public LoadingView(Context context, AttributeSet attrs) {
|
this(context, attrs, 0);
|
}
|
|
public LoadingView(Context context, AttributeSet attrs, int defStyle) {
|
super(context, attrs, defStyle);
|
|
mBalls = new Bitmap[4];
|
|
mBalls[0] = BitmapFactory.decodeResource(context.getResources(), R.drawable.logo_loading_1);
|
mBalls[1] = BitmapFactory.decodeResource(context.getResources(), R.drawable.logo_loading_2);
|
mBalls[2] = BitmapFactory.decodeResource(context.getResources(), R.drawable.logo_loading_3);
|
mBalls[3] = BitmapFactory.decodeResource(context.getResources(), R.drawable.logo_loading_4);
|
|
mBallSize = mBalls[0].getWidth() / 2;
|
mBallPaint = new Paint();
|
mBallPaint.setAntiAlias(true);
|
|
mSquareTrackLength = Utils.dip2px(context, 15);
|
|
int minSize = mSquareTrackLength + mBallSize * 2;
|
setMinimumHeight(minSize);
|
setMinimumWidth(minSize);
|
|
mTimeMillis = System.currentTimeMillis();
|
}
|
|
@Override
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
|
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
|
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
|
int minSize = mSquareTrackLength + mBallSize * 2;
|
|
switch (widthMode) {
|
case MeasureSpec.AT_MOST:
|
widthSize = minSize;
|
break;
|
|
case MeasureSpec.UNSPECIFIED:
|
widthSize = minSize;
|
break;
|
|
case MeasureSpec.EXACTLY:
|
widthSize = Math.max(widthSize, minSize);
|
break;
|
|
default:
|
break;
|
}
|
|
switch (heightMode) {
|
case MeasureSpec.AT_MOST:
|
heightSize = minSize;
|
break;
|
|
case MeasureSpec.UNSPECIFIED:
|
heightSize = minSize;
|
break;
|
|
case MeasureSpec.EXACTLY:
|
heightSize = Math.max(heightSize, minSize);
|
break;
|
|
default:
|
break;
|
}
|
|
super.onMeasure(MeasureSpec.makeMeasureSpec(widthSize, widthMode),
|
MeasureSpec.makeMeasureSpec(heightSize, heightMode));
|
mCenterX = getMeasuredWidth() / 2;
|
mCenterY = getMeasuredHeight() / 2;
|
}
|
|
@Override
|
protected void onVisibilityChanged(View changedView, int visibility) {
|
super.onVisibilityChanged(changedView, visibility);
|
if (visibility == View.VISIBLE)
|
mTimeMillis = System.currentTimeMillis();
|
}
|
|
@Override
|
protected void onDraw(Canvas canvas) {
|
super.onDraw(canvas);
|
|
canvas.save();
|
|
float value = (System.currentTimeMillis() - mTimeMillis) % mDuration * 4 / (float) mDuration;
|
float d = 90 * (int) value;
|
|
canvas.rotate(d, mCenterX, mCenterY);
|
value -= (int) value;
|
|
float offset = value * mSquareTrackLength - mSquareTrackLength / 2;
|
|
float x = offset + mCenterX;
|
float y = mCenterY - mSquareTrackLength / 2;
|
for (int i = 0; i < 4; i++) {
|
canvas.save();
|
canvas.rotate(-d - i * 90, x, y);
|
canvas.drawBitmap(mBalls[i], x - mBallSize, y - mBallSize, mBallPaint);
|
canvas.restore();
|
canvas.rotate(90, mCenterX, mCenterY);
|
}
|
|
canvas.restore();
|
|
invalidate();
|
}
|
}
|