Android 自定义View制作随时间增长的平滑进度条
在做一个短视频录制的项目中,需要一个平滑增加的进度条,开始的想法是做系统自带的进度条然后把最大进度设置到非常大实现,但实际上有点达不到效果,所以就用自定义View的方式来实现。
基本思路:
利用View自带的invalidate()函数,重复调用onDraw()函数来进行进度条的变化。
在onDraw()中利用
System.currentTimeMillis();获取上一次调用onDraw的时间和这次时间得出一个时间差,根据时间差利用
canvas.drawRect(0,0,countWidth,getMeasuredHeight(),progressPaint);重新绘制一个长度的矩形,作为进度条的进度
源码:
package com.text.nickey.progressviewactivity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
/**
* Created by nickey on 2016/3/21.
*/
public class MyProgressView extends View {
private Context mContext;
private WindowManager mWindowManager;
public MyProgressView(Context context) {
this(context, null);
}
public MyProgressView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
init();
}
private int millisecond = 1000;
private float maxProgressSize = 60 * millisecond;//总进度是60
private float eachProgressWidth = 0;
private Paint progressPaint;
private void init(){
//设置每一刻度的宽度
DisplayMetrics dm = new DisplayMetrics();
mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.getDefaultDisplay().getMetrics(dm);
eachProgressWidth = dm.widthPixels / (maxProgressSize * 1.0f);
//进度条的背景颜色
setBackgroundColor(Color.parseColor("#19000000"));
//进度条的前景颜色,画笔
progressPaint = new Paint();
progressPaint.setStyle(Paint.Style.FILL);
progressPaint.setColor(Color.parseColor("#ffffff"));
}
private long initTime = -1;//上一次刷新完成后的时间
private boolean isStart = false;
private float countWidth = 0;//进度条进度的进程,每次调用invalidate()都刷新一次
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isStart){
canvas.drawRect(0,0,countWidth,getMeasuredHeight(),progressPaint);
return;
}
if (initTime == -1){
initTime = System.currentTimeMillis();
canvas.drawRect(0,0,countWidth,getMeasuredHeight(),progressPaint);
invalidate();
return;
}
//这次刷新的时间,用于与上一次刷新完成的时间作差得出进度条需要增加的进度
long thisTime = System.currentTimeMillis();
countWidth += eachProgressWidth * (thisTime - initTime) * 1.0f;
if (countWidth > getMeasuredWidth()){
countWidth = getMeasuredWidth();
}
Log.d("MyProgressView", "onDraw() called with: " + "countWidth = [" + countWidth + "]");
canvas.drawRect(0,0,countWidth,getMeasuredHeight(),progressPaint);
//如果都了最大长度,就不再调用invalidate();了
if (countWidth < getMeasuredWidth() && isStart){
initTime = System.currentTimeMillis();
invalidate();
}else{
countWidth = 0;
initTime = -1;
isStart = false;
}
}
//开始或暂停进度条进度刷新
public void setIsStart(boolean isStart) {
if (isStart == this.isStart)
return;
this.isStart = isStart;
if (isStart) {
initTime = -1;
invalidate();
}
}
//重置进度条
public void reset() {
countWidth = 0;
initTime = -1;
isStart = false;
invalidate();
}
}
源码下载地址:http://download.csdn.net/detail/nickey_1314/9475570