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 PullToLoadView extends View {
|
|
private Bitmap[] mBalls;
|
private int mSquareTrackLength;
|
private int mBallSize;
|
private Paint mBallPaint;
|
|
private int mCenterX;
|
private int mCenterY;
|
|
private float mBoundary = 0.65f;
|
private float mProgress;
|
|
public PullToLoadView(Context context) {
|
this(context, null);
|
}
|
|
public PullToLoadView(Context context, AttributeSet attrs) {
|
this(context, attrs, 0);
|
}
|
|
public PullToLoadView(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);
|
}
|
|
@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 onDraw(Canvas canvas) {
|
super.onDraw(canvas);
|
|
if (mProgress < mBoundary) {
|
mBallPaint.setAlpha(255);
|
canvas.drawBitmap(mBalls[0], mCenterX - mBallSize, mCenterY - mBallSize, mBallPaint);
|
} else {
|
canvas.save();
|
|
float value = (mProgress - mBoundary) / (1 - mBoundary);
|
if (value > 1)
|
value = 1;
|
|
mBallPaint.setAlpha((int) (255 * value));
|
float offset = value * mSquareTrackLength / 2;
|
float x = mCenterX - offset;
|
float y = mCenterY + offset;
|
for (int i = 3; i >= 0; i--) {
|
canvas.save();
|
canvas.rotate((3 - i) * 90, x, y);
|
if (i == 0)
|
mBallPaint.setAlpha(255);
|
canvas.drawBitmap(mBalls[i], x - mBallSize, y - mBallSize, mBallPaint);
|
canvas.restore();
|
canvas.rotate(-90, mCenterX, mCenterY);
|
}
|
|
canvas.restore();
|
}
|
}
|
|
public void drawProgress(float progress) {
|
mProgress = progress;
|
invalidate();
|
}
|
}
|