Flutter绘制-11-旋转小人儿造成的视觉错效

文章描述了作者尝试使用Flutter的CanvasAPI创建一个旋转的人像动画,过程中对动画方向控制、立体投影和代码实现感到困惑,展示了从初版到改进的动画效果和代码片段。
摘要由CSDN通过智能技术生成
  • 在盯着gif看的某一瞬间,旋转方向突然就逆向旋转了
  • 在旋转方向发送变化的同时,左腿变右腿,左手变右手

所以我在想,是不是看的时间久了,就可以任我切换旋转方向,于是盯了半个小时,结果是没成功,收获是方向切换的频次提高了。

我知道它肯定是向着一个方向旋转的,但到现在我依然不能理解为什么会是这样,困惑中。

那,是否能用canvas实现一个呢?

带来的困惑

苦苦思索:

  • 这个人影是立体的,前面《太空人》 曾用到立体投影,这里估计要处理。
  • 我该怎么画这个人儿呢? 用长方体拼凑怕是不合适吧。。。
  • 这人儿的手臂还是伸开的。
  • 在旋转的同时,看脚丫子,好像高低起伏。
第一版效果
  • 先画左右腿
  • 上下起伏

v5.gif

差距,有点远。。。

代码如下:

import ‘dart:ui’;
import ‘dart:math’;

import ‘package:flutter/material.dart’;

// 旋转小人儿
class RotateGirlMainPage extends StatefulWidget {
@override
_RotateGirlMainPageState createState() => _RotateGirlMainPageState();
}

class _RotateGirlMainPageState extends State
with SingleTickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = new AnimationController(
vsync: this, duration: const Duration(milliseconds: 1500));
_controller.repeat();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(“旋转小人儿”),
centerTitle: true,
),
body: CustomPaint(
size: MediaQuery.of(context).size,
painter: _MyPainter(_controller),
),
);
}
}

class _MyPainter extends CustomPainter {
AnimationController _controller;

_MyPainter(this._controller) : super(repaint: _controller);

@override
void paint(Canvas canvas, Size size) {
translateToCenter(canvas, size);
double dy = 10 * sin(pi * 2 * _controller.value);
Path path = new Path()
…moveTo(30 * sin(pi * 2 * _controller.value), dy)
…lineTo(100 * sin(pi * 2 * _controller.value), 220 + dy)
…moveTo(0, dy)
…lineTo(0, 200 + dy)
…lineTo(300, 200 + dy)
…lineTo(-300, 200 + dy);
Paint paint = new Paint()
…color = Colors.black
…style = PaintingStyle.stroke
…strokeWidth = 2
…isAntiAlias = true;
canvas.drawPath(path, paint);
}

@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return true;
}

void translateToCenter(Canvas canvas, Size size) {
canvas.translate(size.width / 2, size.height / 2);
}
}

第二版效果

又仔细观察好像是斜对角的线,即

  • 线的上端点,移动方向,左->右
  • 线的下端点,移动方向,右->左
  • 围绕着y轴旋转,y的坐标上下有波动,x的值通过radius_sin(pi_2*_controller.value)获取。(_controller是设定的一个动画,value取值范围在0-1,radius是旋转半径)

再看下效果:

v6.gif

是不是有那个味儿了。。。

最后,代码如下:

import ‘dart:ui’;
import ‘dart:math’;

import ‘package:flutter/material.dart’;

// 旋转小人儿
class RotateGirlMainPage extends StatefulWidget {
@override
_RotateGirlMainPageState createState() => _RotateGirlMainPageState();
}

class _RotateGirlMainPageState extends State
with SingleTickerProviderStateMixin {
AnimationController _controller;
@override
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-0CI1sVBg-1712271978713)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值