android随着时间增长的条形进度条,Android 自定义View制作随时间增长的平滑进度条...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值