您的位置:首页 > 其它

一个很酷的加载loading效果--IT蓝豹

2015-11-17 10:55 453 查看
一个很酷的加载loading效果,自定义LeafLoadingView实现,LeafLoadingView继承view,

本例子主要由以下几点构成

(1):RotateAnimation实现叶子旋转

(2):叶子飘动

(3):当前进度绘制当前进度条

大体实现:

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

// 绘制进度条和叶子

// 之所以把叶子放在进度条里绘制,主要是层级原因

drawProgressAndLeafs(canvas);

// drawLeafs(canvas);

canvas.drawBitmap(mOuterBitmap, mOuterSrcRect, mOuterDestRect, mBitmapPaint);

postInvalidate();

}

private void drawProgressAndLeafs(Canvas canvas) {

if (mProgress >= TOTAL_PROGRESS) {

mProgress = 0;

}

// mProgressWidth为进度条的宽度,根据当前进度算出进度条的位置

mCurrentProgressPosition = mProgressWidth * mProgress / TOTAL_PROGRESS;

// 即当前位置在图中所示1范围内

if (mCurrentProgressPosition < mArcRadius) {

Log.i(TAG, "mProgress = " + mProgress + "---mCurrentProgressPosition = "

+ mCurrentProgressPosition

+ "--mArcProgressWidth" + mArcRadius);

// 1.绘制白色ARC,绘制orange ARC

// 2.绘制白色矩形

// 1.绘制白色ARC

canvas.drawArc(mArcRectF, 90, 180, false, mWhitePaint);

// 2.绘制白色矩形

mWhiteRectF.left = mArcRightLocation;

canvas.drawRect(mWhiteRectF, mWhitePaint);

// 绘制叶子

drawLeafs(canvas);

// 3.绘制棕色 ARC

// 单边角度

int angle = (int) Math.toDegrees(Math.acos((mArcRadius - mCurrentProgressPosition)

/ (float) mArcRadius));

// 起始的位置

int startAngle = 180 - angle;

// 扫过的角度

int sweepAngle = 2 * angle;

Log.i(TAG, "startAngle = " + startAngle);

canvas.drawArc(mArcRectF, startAngle, sweepAngle, false, mOrangePaint);

} else {

Log.i(TAG, "mProgress = " + mProgress + "---transfer-----mCurrentProgressPosition = "

+ mCurrentProgressPosition

+ "--mArcProgressWidth" + mArcRadius);

// 1.绘制white RECT

// 2.绘制Orange ARC

// 3.绘制orange RECT

// 这个层级进行绘制能让叶子感觉是融入棕色进度条中

// 1.绘制white RECT

mWhiteRectF.left = mCurrentProgressPosition;

canvas.drawRect(mWhiteRectF, mWhitePaint);

// 绘制叶子

drawLeafs(canvas);

// 2.绘制Orange ARC

canvas.drawArc(mArcRectF, 90, 180, false, mOrangePaint);

// 3.绘制orange RECT

mOrangeRectF.left = mArcRightLocation;

mOrangeRectF.right = mCurrentProgressPosition;

canvas.drawRect(mOrangeRectF, mOrangePaint);

}

}

/**

* 绘制叶子

*

* @param canvas

*/

private void drawLeafs(Canvas canvas) {

mLeafRotateTime = mLeafRotateTime <= 0 ? LEAF_ROTATE_TIME : mLeafRotateTime;

long currentTime = System.currentTimeMillis();

for (int i = 0; i < mLeafInfos.size(); i++) {

Leaf leaf = mLeafInfos.get(i);

if (currentTime > leaf.startTime && leaf.startTime != 0) {

// 绘制叶子--根据叶子的类型和当前时间得出叶子的(x,y)

getLeafLocation(leaf, currentTime);

// 根据时间计算旋转角度

canvas.save();

// 通过Matrix控制叶子旋转

Matrix matrix = new Matrix();

float transX = mLeftMargin + leaf.x;

float transY = mLeftMargin + leaf.y;

Log.i(TAG, "left.x = " + leaf.x + "--leaf.y=" + leaf.y);

matrix.postTranslate(transX, transY);

// 通过时间关联旋转角度,则可以直接通过修改LEAF_ROTATE_TIME调节叶子旋转快慢

float rotateFraction = ((currentTime - leaf.startTime) % mLeafRotateTime)

/ (float) mLeafRotateTime;

int angle = (int) (rotateFraction * 360);

// 根据叶子旋转方向确定叶子旋转角度

int rotate = leaf.rotateDirection == 0 ? angle + leaf.rotateAngle : -angle

+ leaf.rotateAngle;

matrix.postRotate(rotate, transX

+ mLeafWidth / 2, transY + mLeafHeight / 2);

canvas.drawBitmap(mLeafBitmap, matrix, mBitmapPaint);

canvas.restore();

} else {

continue;

}

}

}

运行效果:



效果源码:http://www.itlanbao.com/code/20151116/10000/100647.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: