动画高度属性

Posted

技术标签:

【中文标题】动画高度属性【英文标题】:Animating height property 【发布时间】:2019-04-05 21:39:32 【问题描述】:

*** 和 nativescript 用户您好!

我在为视图设置动画时遇到问题。

我想要什么:我正在尝试创建一个可以单击的视图,它会在动画下方打开一个新视图,将所有其他视图进一步向下推。

问题:只有里面的元素有动画或者什么都没有动画 完全没有。

我尝试了什么:我尝试使用 nativescript UI Animations 但没有成功,因为不支持 height 属性。

我的版本:https://gyazo.com/130c2b3467656bcc104c9b8e2c860d94

我很想听听大家提出的解决方案。

【问题讨论】:

scaleY 可以提供帮助,但您的视图可能看起来被挤压了。 github.com/tralves/nativescript-tweenjs - 有潜力 【参考方案1】:

您可以在您的 nativescript 应用程序中使用 tweenjs,定义以下依赖于 tweenjs 的类(使用 npm i @tweenjs/tween.js 安装它)

import * as TWEEN from '@tweenjs/tween.js';
export  Easing  from '@tweenjs/tween.js';

TWEEN.now = function () 
    return new Date().getTime();
;

export class Animation extends TWEEN.Tween 
    constructor(obj) 
        super(obj);
        this['_onCompleteCallback'] = function() 
            cancelAnimationFrame();
        ;
    
    start(time) 
        startAnimationFrame();
        return super.start(time);
    


let animationFrameRunning = false;
const cancelAnimationFrame = function() 
    runningTweens--;
    if (animationFrameRunning && runningTweens === 0) 
        animationFrameRunning = false;
    
;

let runningTweens = 0;
const startAnimationFrame = function() 
    runningTweens++;
    if (!animationFrameRunning) 
        animationFrameRunning = true;
        tAnimate();
    
;
const requestAnimationFrame = function(cb) 
    return setTimeout(cb, 1000 / 60);
;
function tAnimate() 
    if (animationFrameRunning) 
        requestAnimationFrame(tAnimate);
        TWEEN.update();
    

然后,要为视图的高度设置动画,您可以使用这样的方法(这个方法在 nativescript-vue 中有效,但您只需要调整检索视图对象的方式):

import Animation, Easing from "./Animation"

toggle() 
    let view = this.$refs.panel.nativeView
    if (this.showPanel) 
        new Animation( height: this.fixedHeight )
            .to( height: 0 , 500)
            .easing(Easing.Back.In)
            .onUpdate(obj => 
                view.originY = 0
                view.scaleY = obj.height / this.fixedHeight;
                view.height = obj.height;
            )
            .start()
            .onComplete(() => this.showPanel = !this.showPanel);
     else 
        this.showPanel = !this.showPanel
        new Animation( height: 0 )
            .to( height: this.fixedHeight , 500)
            .easing(Easing.Back.Out)
            .onUpdate(obj => 
                view.originY = 0
                view.scaleY = obj.height / this.fixedHeight;
                view.height = obj.height;
            )
            .start();
    

这里讨论过:https://github.com/NativeScript/NativeScript/issues/1764 我主要改进了onUpdate 以获得流畅的动画效果

【讨论】:

感谢您帮我解决这个问题!我不得不编辑 npm 包名称,因为如果只安装“tweenjs”,则无法正确导入库。

以上是关于动画高度属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF 用Binding绑定一个属性,能否带上一个动画?比如我绑定了控件的高度。 但是我希望改变高度时呈现动画

在 jQuery 中,如何为“最大高度”CSS 属性设置动画?

jQuery在更改CSS高度属性时添加动画

不定高元素的高度transition动画实现

高度动画不起作用

关于属性更改的 jQuery 动画