canvas自定义进度条

先上结果,后附代码
aaaa
在这里插入图片描述
在这里插入图片描述

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>show</title>
</head>
<body>
    <div id="show">
        <canvas id="showData" style="height: 20px;width: 300px;"></canvas>
    </div>
</body>
<script src="index.js"></script>
</html>

index.js

var loadeds = 0;
/*========================================================*/
/* Light Loader
/*========================================================*/
var lightLoader = function (c, cw, ch) {

	var _this = this;
	this.c = c;
	this.ctx = c.getContext('2d');
	this.cw = 300;				//父类宽
	this.ch = 150;				//父类高
	this.loaded = startScores;
	this.loaderSpeed = .6;		//加载速度
	this.loaderHeight = 50;		//进度条高度
	this.loaderWidth = 120;		//默认进度条长度
	this.loader = {
		x: (this.cw / 2) - (this.loaderWidth / 2),
		y: (this.ch / 2) - (this.loaderHeight / 2)
	};
	this.particles = [];
	this.particleLift = 180;		//光粒子上扬的高度
	this.hueStart = 0;				//颜色渐变的初始颜色
	this.hueEnd = 120;				//渐变的颜色选择
	this.hue = 0;
	this.gravity = .15;				//光粒子上扬的角度
	this.particleRate = 2;			//光粒子的数量

	/*========================================================*/
	/* Initialize
    /*========================================================*/
	this.init = function () {
		this.loop();
	};

	/*========================================================*/
	/* Utility Functions
    /*========================================================*/
	this.rand = function (rMi, rMa) {
		return ~~((Math.random() * (rMa - rMi + 1)) + rMi);
	};
	this.hitTest = function (x1, y1, w1, h1, x2, y2, w2, h2) {
		return !(x1 + w1 < x2 || x2 + w2 < x1 || y1 + h1 < y2 || y2 + h2 < y1);
	};

	/*========================================================*/
	/* Update Loader		是否循环加载 ,
    /*========================================================*/
	this.updateLoader = function () {
		if (this.loaded < scores) {
			this.loaded += this.loaderSpeed;
			loadeds = this.loaded;
		} else {
			if (flog) {
				this.loaded = startScores;
				loadeds = startScores;
			} else {
				if (this.loaded >= 99) {
					this.particleRate = 0;
				}
			}
		}
	};

	/*========================================================*/
	/* Render Loader
    /*========================================================*/
	this.renderLoader = function () {
		this.ctx.fillStyle = '#000';			//进度条的底层颜色
		this.ctx.fillRect(this.loader.x, this.loader.y, this.loaderWidth, this.loaderHeight);

		this.hue = this.hueStart + (this.loaded / 100) * (this.hueEnd - this.hueStart);

		var newWidth = (this.loaded / 100) * this.loaderWidth;
		this.ctx.fillStyle = 'hsla(' + this.hue + ', 100%, 40%, 1)';
		this.ctx.fillRect(this.loader.x, this.loader.y, newWidth, this.loaderHeight);

		this.ctx.fillStyle = '#222';
		this.ctx.fillRect(this.loader.x, this.loader.y, newWidth, this.loaderHeight / 2);
	};

	/*========================================================*/
	/* Particles
    /*========================================================*/
	this.Particle = function () {
		this.x = _this.loader.x + ((_this.loaded / 100) * _this.loaderWidth) - _this.rand(0, 1);
		this.y = _this.ch / 2 + _this.rand(0, _this.loaderHeight) - _this.loaderHeight / 2;
		this.vx = (_this.rand(0, 4) - 2) / 100;
		this.vy = (_this.rand(0, _this.particleLift) - _this.particleLift * 2) / 100;
		this.width = _this.rand(1, 4) / 2;
		this.height = _this.rand(1, 4) / 2;
		this.hue = _this.hue;
	};

	this.Particle.prototype.update = function (i) {
		this.vx += (_this.rand(0, 6) - 3) / 100;
		this.vy += _this.gravity;
		this.x += this.vx;
		this.y += this.vy;

		if (this.y > _this.ch) {
			_this.particles.splice(i, 1);
		}
	};

	this.Particle.prototype.render = function () {
		_this.ctx.fillStyle = 'hsla(' + this.hue + ', 100%, ' + _this.rand(50, 70) + '%, ' + _this.rand(20, 100) / 100 + ')';
		_this.ctx.fillRect(this.x, this.y, this.width, this.height);
	};

	this.createParticles = function () {
		var i = this.particleRate;
		while (i--) {
			this.particles.push(new this.Particle());
		}
	};

	this.updateParticles = function () {
		var i = this.particles.length;
		while (i--) {
			var p = this.particles[i];
			p.update(i);
		}
	};

	this.renderParticles = function () {
		var i = this.particles.length;
		while (i--) {
			var p = this.particles[i];
			p.render();
		}
	};


	/*========================================================*/
	/* Clear Canvas
    /*========================================================*/
	this.clearCanvas = function () {
		this.ctx.globalCompositeOperation = 'source-over';
		this.ctx.clearRect(0, 0, this.cw, this.ch);
		this.ctx.globalCompositeOperation = 'lighter';
	};

	/*========================================================*/
	/* Animation Loop
    /*========================================================*/
	this.loop = function () {
		var loopIt = function () {
			requestAnimationFrame(loopIt, _this.c);
			_this.clearCanvas();
			_this.createParticles();
			_this.updateLoader();
			_this.updateParticles();
			_this.renderLoader();
			_this.renderParticles();
		};
		loopIt();
	};

};

/*========================================================*/
/* Check Canvas Support
/*========================================================*/
// var isCanvasSupported = function(){
// 	var elem = document.createElement('canvas');
// 	return !!(elem.getContext && elem.getContext('2d'));
// };

/*========================================================*/
/* Setup requestAnimationFrame
/*========================================================*/
var setupRAF = function () {
	var lastTime = 0;
	var vendors = ['ms', 'moz', 'webkit', 'o'];
	for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
		window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
		window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
	}
	if (!window.requestAnimationFrame) {
		window.requestAnimationFrame = function (callback, element) {
			var currTime = new Date().getTime();
			var timeToCall = Math.max(0, 16 - (currTime - lastTime));
			var id = window.setTimeout(function () {
				callback(currTime + timeToCall);
			}, timeToCall);
			lastTime = currTime + timeToCall;
			return id;
		};
	}
	if (!window.cancelAnimationFrame) {
		window.cancelAnimationFrame = function (id) {
			clearTimeout(id);
		};
	}
};

/*========================================================*/
/* Define Canvas and Initialize
/*========================================================*/
var scores = 100;
var startScores = 0;
var flog = false;

function showProgressBar(id, num1, num2, boo) {
	scores = num2;
	if (scores > 100) {
		scores = 100;
	}
	startScores = num1;
	flog = boo;
	var c = document.getElementById(id);
	// var cw = c.width;
	var cw = c.offsetWidth;
	// var ch = c.height;
	var ch = c.offsetHeight;
	// document.body.appendChild(c);
	var cl = new lightLoader(c, cw, ch);
	setupRAF();
	cl.init();
}
// 进度条控制方法
showProgressBar("showData",0,100,true);  // id ,开始 分数 ,循环

function getLoaded() {
	return loadeds;
}
function setScores(){
	loadeds = 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Android 自定义进度条控件的实现,我可以为您提供一些思路和示例代码。 首先,我们需要继承自 View 或者 ProgressBar,然后在 onDraw 方法中实现自己的绘制逻辑。具体来说,需要绘制背景、进度条和文本等内容。 示例代码如下: ```java public class CustomProgressBar extends ProgressBar { private Paint mPaint; private String mText; private Rect mRect; public CustomProgressBar(Context context) { super(context); init(); } public CustomProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomProgressBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mRect = new Rect(); } @Override protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制背景 mPaint.setColor(Color.GRAY); mPaint.setStyle(Paint.Style.FILL); canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint); // 绘制进度条 mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.FILL); float progress = getProgress() * 1.0f / getMax(); canvas.drawRect(0, 0, getWidth() * progress, getHeight(), mPaint); // 绘制文本 mPaint.setColor(Color.WHITE); mPaint.setTextSize(24); mText = getProgress() + "%"; mPaint.getTextBounds(mText, 0, mText.length(), mRect); float x = getWidth() / 2f - mRect.centerX(); float y = getHeight() / 2f - mRect.centerY(); canvas.drawText(mText, x, y, mPaint); } } ``` 这个自定义控件实现了一个简单的水平进度条,包括了背景、进度条和文本三个部分。当然,您可以根据自己的需求进行更改和扩展。 希望这个示例代码能够帮助到您,如果您还有其他问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值