背景
iOS攻城狮去年4月份从上海回到长沙工作,面试时有接触做海外工具类项目的公司,其中就有类似LED跑马灯这种项目(当时很纳闷为啥这种小众的需求也能养活一家公司)。这次趁着假期,想用Flutter实现一下这种效果。于是,我花了几十字描述需求,丢给Claude,结果三分钟就生成完整的了商业级App。主要分为四个模块:
- 跑马灯
- 手电筒
- 大字幕
- 设置
涉及到的技术点主要有:
- 状态管理:Riverpod
- 渲染引擎:CustomPainter + Ticker
- 数据持久化:shared_preferences
void _drawText(Canvas canvas, double x, double y) {
final theme = ColorTheme.find(message.colorThemeId);
switch (message.effectId) {
case 'blink':
final a = (sin(phase * 5) + 1) / 2 * 0.8 + 0.2;
_drawString(canvas, x, y, theme, opacity: a);
case 'breath':
final a = (sin(phase * 1.5) + 1) / 2 * 0.7 + 0.3;
_drawString(canvas, x, y, theme, opacity: a);
case 'wave':
_drawWave(canvas, x, y, theme);
case 'neon':
_drawNeon(canvas, x, y, theme);
case 'rainbow':
_drawRainbow(canvas, x, y);
default:
_drawString(canvas, x, y, theme);
}
}
void _drawString(Canvas canvas, double x, double y, ColorTheme theme,
{double opacity = 1.0}) {
if (theme.isGradient) {
_drawGradient(canvas, x, y, theme, opacity: opacity);
} else {
_tp(theme.singleColor.withOpacity(opacity))
..layout(maxWidth: double.infinity)
..paint(canvas, _offset(x, y));
}
}
void _drawGradient(Canvas canvas, double x, double y, ColorTheme theme,
{double opacity = 1.0}) {
final tp = _tp(Colors.white)..layout(maxWidth: double.infinity);
final rect = Rect.fromLTWH(x, y - tp.height / 2, textWidth, tp.height);
canvas.saveLayer(
Rect.fromLTWH(x - 10, y - tp.height, textWidth + 20, tp.height * 2),
Paint());
tp.paint(canvas, _offset(x, y));
canvas.drawRect(
rect,
Paint()
..blendMode = BlendMode.srcIn
..shader = LinearGradient(
colors: theme.colors.map((c) => c.withOpacity(opacity)).toList(),
begin: Alignment.centerLeft,
end: Alignment.centerRight,
).createShader(rect),
);
canvas.restore();
}
void _drawWave(Canvas canvas, double x, double y, ColorTheme theme) {
double curX = x;
final chars = message.text.split('');
for (int i = 0; i < chars.length; i++) {
final waveY = y + sin(phase * 3 + i * 0.6) * 14;
final tp = _tpChar(chars[i], theme.singleColor)
..layout(maxWidth: double.infinity);
tp.paint(canvas, Offset(curX, waveY - tp.height / 2));
curX += tp.width;
}
}
void _drawNeon(Canvas canvas, double x, double y, ColorTheme theme) {
final glow = (sin(phase * 2) + 1) / 2 * 8 + 8;
final color = theme.singleColor;
final style = TextStyle(
fontSize: message.fontSize,
fontWeight: FontWeight.bold,
color: color,
shadows: [
Shadow(color: color.withOpacity(0.9), blurRadius: glow * 2),
Shadow(color: color.withOpacity(0.5), blurRadius: glow * 4),
],
);
final tp = TextPainter(
text: TextSpan(text: message.text, style: style),
textDirection: TextDirection.ltr,
)..layout(maxWidth: double.infinity);
tp.paint(canvas, _offset(x, y));
}
void _drawRainbow(Canvas canvas, double x, double y) {
double curX = x;
final chars = message.text.split('');
for (int i = 0; i < chars.length; i++) {
final hue = ((phase * 0.3 + i * 0.12) % 1.0) * 360;
final color = HSVColor.fromAHSV(1, hue, 1, 1).toColor();
final tp = _tpChar(chars[i], color)..layout(maxWidth: double.infinity);
tp.paint(canvas, Offset(curX, y - tp.height / 2));
curX += tp.width;
}
}
文字特效包括闪烁、呼吸、波浪、霓虹、彩虹流等,完整代码,效果如下:
思考
实现后,我沉默了。坐在窗台前发呆了一会儿...
回想起Oracle刚裁了三万人。
理由是:要给AI腾出现金流。
公司利润涨了95%,裁员。
Block裁掉40%员工,CEO说得很坦诚:AI让小团队能干大组织以前干的活。
消息发布当天,股价涨了23%。
华尔街在鼓掌。
然后我看到一个更让我难受的数据。
有研究追踪了美国2.85亿条招聘广告。
结论是:AI高暴露度岗位,入门级岗位数量下降了18%到40%。
不是裁员。
是根本不招了。
企业不需要那么多新人进来打基础了,因为AI帮中级员工把基础活全干了。
那些排队等着进来的应届生,敲了半天门,发现门已经在关了。
有人说:AI只是工具,会用就不怕。
这句话我以前也说过。
现在我觉得,这句话是对的,但是它说的和你以为的,不是同一件事。
我做了一个实验。
三分钟建完Flutter项目以后,我继续用Claude往下推。
我让它帮我接入一个复杂的第三方SDK。
它给了代码。
跑不起来。
我让它修。
它改了。
还是跑不起来,换了另一个地方报错。
我用了三十分钟,才把这个问题搞定。
那三十分钟里,我至少判断了五次:它给的方向对不对、改动有没有副作用、下一步该往哪走。
每一次判断,都是我的,不是AI的。
AI给了我一块建好的毛坯房。
但毛坯房里的水路怎么走、墙能不能打、哪里藏着老问题——
这些还是得我来。
只不过,现在不会这些的人,根本进不了门。
这才是真正让我脊背发凉的地方。
不是"AI取代程序员"。
是门槛在移动。
以前你用三年打基础,然后有机会做复杂的事。
现在,那三年的基础工作,AI一秒钟能做几千遍。
你没有机会用三年时间"从基础成长起来"了。
你从第一天起,就必须站在AI已经帮你建好的基础之上,往上走。
所以我现在想清楚了一件事:
AI时代真正的分水岭,不是会不会用AI。
是在AI给出答案以后,你有没有能力判断这个答案对不对。
判断能力,不是靠看视频学来的。
不是靠背八股文学来的。
是靠一个一个真实问题砸在脑子里,搞定了,积累出来的。
那我们怎么办?
我说三个不废话的事。
第一件事,立刻把AI用起来,但不要只用它生成。
用它测试你的判断。
你先想好方案,然后问AI,看它给的和你想的哪里不一样,为什么不一样。
这样你还是在成长。
反过来,你什么都不想,直接把AI输出的往上交,你的判断力就是在退化。
第二件事,向上走,不要横着走。
不要花时间去学"怎么把AI用得更顺手"这种技巧。
要花时间搞清楚你所在领域里最难的那个问题是什么,把它搞清楚。
AI能帮你速成浅层的东西。
深层的东西,它只是帮你省时间,但路还是你自己走。
第三件事,别等行情好了再说。
那47个Oracle的DBA,被AI用8个月学完了他们的经验。
他们可能每一个人当时都觉得,"我这岗位稳着呢,技术活哪有那么好学"。
等到知道的时候,邮件已经在路上了。
结论
所以我的结论是什么?
不是"拥抱AI就能赢"。
也不是"坚守初心终会胜"。
是:
在AI能做的事里,你只是执行者。
在AI做不到的地方,你才是那个人。
你要知道自己的那个地方在哪里。
然后,每一天都往那里多走一步。
就算只有一步。
你有没有用过AI做出让自己惊喜、又让自己有点害怕的东西?评论区聊聊,我想看看大家的真实感受。