UI和功能是好的產品的兩個重要因素,很多產品往往只注重功能上的設計,而忽略了UI。在這個“看臉”的時代,就算產品的功能很強大,如果UI跟不上步伐,你的產品都會在客戶心中大打折扣。
做安全和監控的項目中經常會進行掃描,一般會用一個gif圖片來表示軟件正在進行掃描,但是如果想更換這個圖標的樣式,就需要美工重新做圖。TWaver提供了動畫效果,如果對圖標的動畫樣式不滿意,可以通過簡單的更改程序來實現,避免了美工的二次返工,提高了效率。切入正題,看我們怎么實現一個動畫的雷達掃描圖,首先注冊一個圖片,用HTML5的canvas畫了一個靜態的雷達圖,如果你熟悉TWaver的話,下邊這段代碼應該不難。如果不熟悉的話,可以參考產品文檔自定義繪制(draw)這一節的內容。
twaver.Util.registerImage('radar', {
v: [
{
shape: 'draw',
draw: function (ctx, data, view) {
var canvas = this.canvas,
g = this.g,
gradient = this.gradient,
diameter = Math.floor(data.getWidth() * view.getZoom()),
radius = diameter / 2,
hueStart = 120,
hueEnd = 170,
hueDiff = Math.abs(hueEnd - hueStart),
width = diameter,
height = diameter;
if (!canvas) {
this.canvas = canvas = document.createElement('canvas');
}
if (width !== canvas.width || height !== canvas.height) {
canvas.width = diameter;
canvas.height = diameter;
this.g = g = canvas.getContext('2d');
this.gradient = gradient = g.createLinearGradient(radius, 0, 0, 0);
gradient.addColorStop(0, 'hsla(' + hueStart + ', ' + 50 + '%, ' + 40 + '%, 1)');
gradient.addColorStop(1, 'hsla(' + hueEnd + ', ' + 50 + '%, ' + 40 + '%, 0.1)');
}
g.globalCompositeOperation = 'destination-out';
g.fillStyle = 'hsla(0, 0%, 0%, 0.1)';
g.fillRect(0, 0, width, height);
g.globalCompositeOperation = 'lighter';
var i;
for (i = 0; i < 4; i++) {
g.beginPath();
g.arc(radius, radius, ((radius - 1) / 4) * (i + 1), 0, Math.PI * 2, false);
g.strokeStyle = 'hsla(' + (hueEnd - (i * (hueDiff / 4))) + ', ' + 50 + '%, ' + 40 + '%, 0.1)';
g.lineWidth = 3;
g.stroke();
};
g.beginPath();
g.moveTo(radius - 1, 2);
g.lineTo(radius - 1, height - 2);
g.moveTo(2, radius - 1);
g.lineTo(width - 2, radius - 1);
g.strokeStyle = 'hsla(' + ((hueStart + hueEnd) / 2) + ', ' + 50 + '%, ' + 40 + '%, .03)';
g.stroke();
g.save();
g.translate(radius, radius);
g.rotate(data.getClient('angle'));
g.beginPath();
g.moveTo(0, 0);
g.arc(0, 0, radius, -0.0349, 0.0349, false);
g.closePath();
g.fillStyle = gradient;
g.fill();
g.restore();
ctx.scale(1 / view.getZoom(), 1 / view.getZoom());
ctx.drawImage(canvas, -width / 2, -height / 2);
}
}
]
});
接下來給這個雷達圖設置一個動態的效果,讓雷達圖不斷的掃描。下邊的這段代碼設置了雷達指針的掃描角度,持續時間:
new twaver.Animate({ source: node, attr: 'C@angle', from: 0, to: Math.PI * 2, dur: 4000, repeat: Number.POSITIVE_INFINITY, reverse: false }).play(); }
這樣一個簡單的雷達動畫效果就出來了,是不是很簡答,如果對這個效果用興趣的,可以發郵件索取源代碼,附上郵箱:jack.shangguan@servasoft.com
