我正在寻找执行一些物理动画并在一组DOM元素上执行动画。不是画布。 非常重要:不是画布。Angular2物理动画
我有它的工作,但性能比我预期的要慢,即使考虑了昂贵的DOM操作是多么昂贵。即使您将时间间隔调整为不太频繁,如果您一次在页面上有多个组件,它将无法使用。
我想知道是否有一个更简单或更高性能的方式,同时保持在Angular中的东西。也许一种方法可以跳过区域的角度渲染?做它香草没有利用角绑定等方式更高性能,所以我想知道如果我只是做错误的角度部分,或者如果我应该打破这些部分免费的Angular。我认为区域应该超越全球操纵......虽然......?
示例代码扭动在屏幕上的东西(真正的动画都比较复杂,但遵循这个确切的技术):
@Component({
selector: 'thingy,[thingy]',
template: `<div #container [ngStyle]="getStyle()"><ng-content></ng-content></div>`
})
export class Thingy implements OnInit, OnDestroy {
private _x:number = 0;
private _y:number = 0;
private _interval:any;
private _style:CSSStyleDeclaration = {
left: 0,
top: 0,
position: absolute
};
constructor(){}
ngOnInit() {
this._interval = setInterval(() => {
this._x++;
this._y = Math.sin(this._x);
this._style.left = this._x + "px";
this._style.top = this._y + "px";
});
}
ngOnDestroy() {
clearInterval(this._interval); // because it continues ticking after destroy
}
getStyle():CSSStyleDeclaration {
return this._style; // in angular1 it was bad joojoo to return a new object each time so i avoid doing so here too
}
}
我已经优化了这种做法,就像我知道怎么办。我认为内置的动画元数据解决方案可以处理大多数场景,但是我没有尝试过,因为a)我无法想象如何添加更多抽象提高性能,以及b)这些动画不是状态转换,因此它看起来不像适当。
我也使用更多的这样的一个模板尝试,但它似乎并没有太大的不同:
<div [style.top.px]="_y" [style.left.px]="_x"><ng-content></ng-content></div>
而且,我已经试过直接与ElementRef搞乱但肯定没帮助:
@ViewChild("container") container:ElementRef;
this._container.nativeElement.styles.top = this._y + "px";
如果最好在Angular的控制之外做到这一点,那么有没有什么标准呢?我可以用一个Component绘制DOM元素,然后发送一个Window事件来启动非角度代码...
另外值得注意的是:我不能从A点开始并立即跳到B点以便让CSS转换画动画。动画不足以过渡/缓解。除非这是一个非常聪明的解决方案,否则我不会看到它是如何动画的,除了在每个步骤中滴答滴答。
出于好奇,你有没有尝试在Angular 2中使用内置的Renderer'setElementStyle',而不是通过ngStyle指令来应用样式? – jsfrocha
我还没有试过渲染器。我会尝试(可能是几天),并更新我发现的。 – oooyaya