AnimationTask分析

class ComponentAnimator::AnimationTask

{

public:

AnimationTask (Component* c) noexcept  : component (c) {}

void reset (const Rectangle<int>& finalBounds,

float finalAlpha,

int   millisecondsToSpendMoving,

bool  useProxyComponent,

double startSpd, double endSpd)

{

msElapsed = 0;

msTotal = jmax (1, millisecondsToSpendMoving);

lastProgress = 0;

destination = finalBounds;

destAlpha = finalAlpha;

isMoving = (finalBounds != component->getBounds());

isChangingAlpha = (finalAlpha != component->getAlpha());

left    = component->getX();

top     = component->getY();

right   = component->getRight();

bottom  = component->getBottom();

alpha   = component->getAlpha();

const double invTotalDistance = 4.0 / (startSpd + endSpd + 2.0);

startSpeed = jmax (0.0, startSpd * invTotalDistance);

midSpeed = invTotalDistance;

endSpeed = jmax (0.0, endSpd * invTotalDistance);

if (useProxyComponent)

proxy = new ProxyComponent (*component);

else

proxy = nullptr;

component->setVisible (! useProxyComponent);

}

//这个函数就是进行位置和透明度的变化

bool useTimeslice (const int elapsed)

{

if (Component* const c = proxy != nullptr ? static_cast<Component*> (proxy): static_cast<Component*> (component))

{

msElapsed += elapsed;

double newProgress = msElapsed / (double) msTotal;

if (newProgress >= 0 && newProgress < 1.0)

{

newProgress = timeToDistance (newProgress);

const double delta = (newProgress - lastProgress) / (1.0 - lastProgress);

jassert (newProgress >= lastProgress);

lastProgress = newProgress;

if (delta < 1.0)

{

bool stillBusy = false;

if (isMoving)

{

//偏移位置

left   += (destination.getX()      - left)   * delta;

top    += (destination.getY()      - top)    * delta;

right  += (destination.getRight()  - right)  * delta;

bottom += (destination.getBottom() - bottom) * delta;

const Rectangle<int> newBounds (roundToInt (left),

roundToInt (top),

roundToInt (right - left),

roundToInt (bottom - top));

if (newBounds != destination)

{

c->setBounds (newBounds);

stillBusy = true;

}

}

//偏移透明度

if (isChangingAlpha)

{

alpha += (destAlpha - alpha) * delta;

c->setAlpha ((float) alpha);

stillBusy = true;

}

if (stillBusy)

return true;

}

}

}

moveToFinalDestination();

return false;

}

//移动到结束位置

void moveToFinalDestination()

{

if (component != nullptr)

{

component->setAlpha ((float) destAlpha);

component->setBounds (destination);

if (proxy != nullptr)

component->setVisible (destAlpha > 0);

}

}

//==============================================================================

class ProxyComponent  : public Component

{

public:

ProxyComponent (Component& c)

{

setWantsKeyboardFocus (false);

setBounds (c.getBounds());

setTransform (c.getTransform());

setAlpha (c.getAlpha());

setInterceptsMouseClicks (false, false);

if (Component* const parent = c.getParentComponent())

parent->addAndMakeVisible (this);

else if (c.isOnDesktop() && c.getPeer() != nullptr)

addToDesktop (c.getPeer()->getStyleFlags() | ComponentPeer::windowIgnoresKeyPresses);

else

jassertfalse; // seem to be trying to animate a component that‘s not visible..

const float scale = (float) Desktop::getInstance().getDisplays()

.getDisplayContaining (getScreenBounds().getCentre()).scale;

image = c.createComponentSnapshot (c.getLocalBounds(), false, scale);

setVisible (true);

toBehind (&c);

}

void paint (Graphics& g) override

{

g.setOpacity (1.0f);

g.drawImageTransformed (image, AffineTransform::scale (getWidth()  / (float) image.getWidth(),

getHeight() / (float) image.getHeight()), false);

}

private:

Image image;

JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProxyComponent)

};

WeakReference<Component> component;//移动的控件

ScopedPointer<Component> proxy; //代理,也就是用一张图来显示控件内容

Rectangle<int> destination; //目标位置

double destAlpha; //透明度

int msElapsed, msTotal; //使用了多少时间

double startSpeed, midSpeed, endSpeed, lastProgress; //计算得到的几个速度

double left, top, right, bottom, alpha;

bool isMoving, isChangingAlpha;

private:

//这里的时间是限制在0到1之间?

double timeToDistance (const double time) const noexcept

{

return (time < 0.5) ? time * (startSpeed + time * (midSpeed - startSpeed))

: 0.5 * (startSpeed + 0.5 * (midSpeed - startSpeed))

+ (time - 0.5) * (midSpeed + (time - 0.5) * (endSpeed - midSpeed));

}

};

来自为知笔记(Wiz)

时间: 2024-10-10 22:08:29

AnimationTask分析的相关文章

爱奇艺、优酷、腾讯视频竞品分析报告2016(一)

1 背景 1.1 行业背景 1.1.1 移动端网民规模过半,使用时长份额超PC端 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>,报告显示,网民的上网设备正在向手机端集中,手机成为拉动网民规模增长的主要因素.截至2015年12月,我国手机网民规模达6.20亿,有90.1%的网民通过手机上网. 图 1  2013Q1~2015Q3在线视频移动端和PC端有效使用时长份额对比 根据艾瑞网民行为监测系统iUserTracker及mUserTrac

Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)

原文:http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量) 用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读.在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOME的值.接着判断当前目录下是否存在bin\catalina.bat,如果文件

C# 最佳工具集合: IDE 、分析、自动化工具等

C#是企业中广泛使用的编程语言,特别是那些依赖微软的程序语言.如果您使用C#构建应用程序,则最有可能使用Visual Studio,并且已经寻找了一些扩展来对您的开发进行管理.但是,这个工具列表可能会改变您编写C#代码的方式. C#编程的最佳工具有以下几类: IDE VS扩展 编译器.编辑器和序列化 反编译和代码转换工具 构建自动化和合并工具 版本控制 测试工具和VS扩展 性能分析 APM 部署自动化 容器 使用上面的链接直接跳转到特定工具,或继续阅读以浏览完整列表.

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动,

Openfire分析之二:主干程序分析

引言 宇宙大爆炸,于是开始了万物生衍,从一个连人渣都还没有的时代,一步步进化到如今的花花世界. 然而沧海桑田,一百多亿年过去了-. 好复杂,但程序就简单多了,main()函数运行,敲个回车,一行Hello World就出来了,所以没事多敲敲回车,可以练手感-. 一.程序入口 Java的程序入口是main方法,Openfire也不例外.可以全局检索一下"void main",可以看到,Openfire的main函数有两个: (1)org.jivesoftware.openfire.lau

gecode FunctionBranch 源码分析

从名字上看,这个类的核心就在于function, 那么看代码: /// Function to call SharedData<std::function<void(Space& home)>> f; /// Call function just once bool done; 的确是定义了一个function,然后一个状态,猜测是调用了function之后会设置为true,往下看代码: ExecStatus FunctionBranch::commit(Space&

爬虫难点分析

难点分析 1.网站采取反爬策略 2.网站模板定期变动 3.网站url抓取失败 4.网站频繁抓取ip被封 1.网站采取反爬策略 >网站默认对方正常访问的方式是浏览器访问而不是代码访问,为了防止对方使用大规模服务器进行爬虫从而导致自身服务器承受过大的压力,通常网站会采取反爬策略 根据这一特性,我们用代码模拟实现浏览器访问 2.网站模板定期变动-解决方案 >标签变动,比如<div>变动,那么我们不能把代码给写死了 (1)不同配置文件配置不同网站的模板规则 (2)数据库存储不同网站的模板规

R语言学习-词频分析

概念 1.语料库-Corpus 语料库是我们要分析的所有文档的集合,就是需要为哪些文档来做词频 2.中文分词-Chinese Word Segmentation 指的是将一个汉字序列切分成一个一个单独的词语. 3.停用词-Stop Words 数据处理的时候,自动过滤掉某些字或词,包括泛滥的词如Web.网站等,又如语气助词如的.地.得等. 需要加载的包 1.tm包 安装方式:install.packages("tm") 语料库: Corpus(x,readerControl) x-语料

/proc/meminfo分析

参考: 1. linux/Documentation/filesystems/proc.txt 2. Linux 中 /proc/meminfo 的含义 分析文件信息最权威的就是linux自带的文档,Documentation/filesystems/proc.txt较详细地介绍了proc内容. meminfo: Provides information about distribution and utilization of memory.  This varies by architect