【Canvas】绘制时间轴+动态当前时间线

效果:

在这里插入图片描述

代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Canvas绘制时间轴</title>
<style>
	body {
		padding: 0;
		margin: 0;
	}

	canvas {
		display: block;
		margin: 200px auto;
	}
</style>
</head>
<body>
<canvas id="solar" width="800" height="400"></canvas>
<script>
var width = document.querySelector("#solar").width
var height = document.querySelector("#solar").height

var HEIGHT = this.height
var WIDTH = this.width
var timeWidth = WIDTH - 100
var cell = timeWidth/(12*60) // 一分钟的宽度,每十分钟一小格 每六个小格一个大格
var timeW = WIDTH * 0.042 // 时间背景宽度
var timeH = timeW * 0.75 // 时间背景高度
var timeGap = WIDTH * 0.063 // 时间间隔
var interval = {}
var context = {}

init()

function init(){
    let canvas = document.querySelector("#solar")
    let ctx = canvas.getContext("2d")
    this.width = canvas.width
    this.height = canvas.height
    // !!!重要:ctx赋值全局变量,以免传输中改变
    context = ctx

    this.clear()
    // 绘制时间轴时间线
    this.countLine()
    interval = setInterval(() => {
        this.countLine()
    }, 5000)
}

// 清画布
function clear(){
    context.clearRect(0, 0, this.width, this.height)
}

// 绘制动态时间线
function countLine() {
    let beginY = 100
    let beginX = 50
    let beginTime = 8
    
    // 计算出当前时间与8:30之间的差值
    let time = new Date();
    let t1 = new Date(time.toLocaleDateString() + " 8:30:00")
    let t2 = new Date(time.toLocaleDateString() + " 20:30:00")
    let diffMinute = (time - t1)/1000/60
    let len = diffMinute * cell + beginX
    if(time > t2){ // 超过20:30 时间从20:30开始显示
        diffMinute = (time - t2)/1000/60
        len = diffMinute * cell + beginX
        beginTime = 20
    } 
    context.beginPath()
    context.moveTo(len, beginY)
    context.lineTo(len, HEIGHT)
    context.strokeStyle = "#9099A5"
    context.stroke()
    // 绘制刻度
    this.drawScale(beginTime)
}

function drawScale(beginTime) {
    this.clear()
    // 坐标轴基准线
    let beginY = 100
    let beginX = 50
    // 绘制坐标横轴
    context.strokeStyle = "#9099A5"
    context.moveTo(beginX, beginY)
    context.lineTo(beginX + timeWidth, beginY)
    context.stroke()
    // 绘制短竖线
    for(let i = 0; i <= 72; i++){
        if(i%6 === 0){ // 绘制大格
            context.moveTo(beginX, beginY - 30)
            context.lineTo(beginX, beginY + 30)
            context.stroke()
            if(beginTime >= 24){
                beginTime = beginTime - 24
            }
            context.fillText(beginTime + ':30', beginX-10, beginY - 50)
            beginTime +=1
        }else{ // 绘制小格
            context.moveTo(beginX, beginY - 15)
            context.lineTo(beginX,beginY + 15)
            context.stroke()
        }
        beginX += cell * 10
    }
}

</script>
</body>
</html>
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过自定义布局和绘制来实现一个横向时间轴。以下是一个简单的示例: 1. 创建一个自定义的视图类,继承自 View。 ```java public class TimelineView extends View { private List<String> events; // 存储时间轴上的事件列表 public TimelineView(Context context) { super(context); init(); } public TimelineView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public TimelineView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { events = new ArrayList<>(); // 初始化事件列表 events.add("事件1"); events.add("事件2"); events.add("事件3"); // ... } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight(); // 绘制时间轴的线 Paint linePaint = new Paint(); linePaint.setColor(Color.RED); linePaint.setStrokeWidth(5); canvas.drawLine(0, height / 2, width, height / 2, linePaint); // 绘制时间轴上的事件 Paint textPaint = new Paint(); textPaint.setColor(Color.BLACK); textPaint.setTextSize(30); int eventCount = events.size(); int eventSpacing = width / (eventCount + 1); // 事件之间的间距 for (int i = 0; i < eventCount; i++) { float xPos = eventSpacing * (i + 1); float yPos = height / 2; canvas.drawText(events.get(i), xPos, yPos, textPaint); } } } ``` 2. 在你的布局文件中使用自定义的 TimelineView。 ```xml <com.example.timeline.TimelineView android:layout_width="match_parent" android:layout_height="100dp" /> ``` 请注意,上述代码只是一个基本示例,你可以根据自己的需求进行扩展和美化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值