zoukankan      html  css  js  c++  java
  • Animations使用01 BrowserAnimationsModule

    1 基础知识

      1.1 动画

        就是从一个状态过渡到另外一个状态

      1.2 状态

        元素本身的形状、颜色、大小等

      1.3 Angular中的动画

        给元素添加一个触发器,当这个触发器被触发后就会让该元素的状态发生变化,其中状态用state表示,状态之间的转变用transition表示

    2 如何使用BrowserAnimationsModule

      2.1 下载 animations 依赖库

        cnpm install --save @angular/animations

      2.2 在模块级别导入 BrowserAnimationsModule

        

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    
    import { CoreModule } from './core/core.module';
    import { SharedModule } from './shared/shared.module';
    import { LoginModule } from './login/login.module';
    import { ProjectModule } from './project/project.module';
    import { TaskModule } from './task/task.module';
    import { TestModule } from './test/test.module';
    import { AppRoutingModule } from './app-routing.module';
    
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    
    import { AppComponent } from './app.component';
    
    @NgModule({
      declarations: [
        AppComponent
      ],
      imports: [
        BrowserModule,
        CoreModule,
        SharedModule,
        LoginModule,
        ProjectModule,
        TaskModule,
        TestModule,
        AppRoutingModule,
        BrowserAnimationsModule
      ],
      providers: [],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    View Code

      2.2 在需要用到animations动画的组件中定义触发器trigger、状态state、过渡transition

        技巧01:一个组件可以对应多个触发器,一个触发器对应多个状态,两个状态之间对应一个过渡

        

        技巧01: trigger、state、style、transition、animate都是方法

        技巧02:animate方法时用来控制过渡时间的,它如果之传入一个数字型的参数时表示过渡时间,如果传入一个有空格分割字符时空格前的部分表示过渡时间,空格后面的部分表示暂停时间

    import { Component, OnInit } from '@angular/core';
    import { MdDialog, MD_DIALOG_DATA, MdDialogRef } from '@angular/material';
    import { Test02Component } from '../test02/test02.component';
    import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'
    
    import { trigger, state, transition, style, animate} from '@angular/animations';
    
    @Component({
      selector: 'app-test',
      templateUrl: './test.component.html',
      styleUrls: ['./test.component.scss'],
      animations: [
        trigger(
          'square', [
            state('green', style({'background-color': 'green', 'height': '100px', 'width': '100px', 'transform': 'translate(0)'})),
            state('skyblue', style({'background-color': 'skyblue', 'height': '50px', 'width': '50px', 'transform': 'translate(100%)'})),
            transition('green => skyblue', animate(1000)),
            transition('skyblue => green', animate('0.2s 1s'))
          ]
        )
      ]
    })
    export class TestComponent implements OnInit {
    
      color = "red";
    
      squareState: string;
    
      constructor(
        private dialog: MdDialog
      ) { }
    
      ngOnInit() {}
    
      onChangeClick() {
        this.squareState = this.squareState === 'skyblue' ? 'green' : 'skyblue';
      }
    
      openNewProjectDialog() {
        const dialogRef = this.dialog.open(Test02Component, {
          height: `400px`,
           '400px',
          data: `hello world`
        });
        dialogRef.afterClosed().subscribe(result => console.log(result));
      }  
    
      onClick(value: string) {
        alert(`你点击了 -> ${value}`);
      }
    
      onTest01() {
        this.dialog.open(ConfirmDialogComponent, {
          data: {
            title: '确认对话框',
            content:  '测试确认对话框的内容'
          }
        });
        alert('测试确认对话框');
      }
    
    }
    View Code

      2.3 元素如何同触发器进行绑定

        

    <h3>GridList</h3>
    <div class="box">
      <md-grid-list cols="4">
        <md-grid-tile>
          <md-grid-tile-header>页眉</md-grid-tile-header>
          <md-icon>menu</md-icon>测试01
          <md-grid-tile-footer>页脚</md-grid-tile-footer>
        </md-grid-tile> 
      </md-grid-list>
    </div>
    <hr />
    
    <h3>Dialog</h3>
    <div class="box">
      <button class="fab-button" md-fab type="button" (click)="openNewProjectDialog()" color="primary">
          <md-icon>add</md-icon>
      </button>
    </div>
    
    <h3>Menu</h3>
    <div class="box">
      <button class="fab-button" md-fab type="button"  color="accent" [mdMenuTriggerFor]="testMenu">
          <md-icon>menu</md-icon>
      </button>
      <md-menu #testMenu="mdMenu">
        <button md-menu-item (click)="onClick('刷新按钮')">
          <md-icon>autorenew</md-icon>
          <span>刷新</span>
        </button>
        <button md-menu-item (click)="onClick('设置按钮')">
          <md-icon>settings</md-icon>
          <span>设置</span>
        </button>
      </md-menu>
    </div>
    
    <h3>Radio</h3>
    <div class="box">
      <md-radio-group>
        <md-radio-button value="1"></md-radio-button>
        <md-radio-button value="2"></md-radio-button>
      </md-radio-group>
    </div>
    
    <h3>日期</h3>
    <div class="box">
      <md-input-container class="full-width">
        <input mdInput type="text" placeholder="日期测试" [mdDatepicker]="datepicker" />
        <button type="button" mdPrefix [mdDatepickerToggle]="datepicker"></button>
      </md-input-container>
      <md-datepicker #datepicker></md-datepicker>
    </div>
    
    <h3>对话框</h3>
    <div class="box">
      <button type="button" md-raised-button (click)="onTest01()">确认对话框</button>
    </div>
    
    <h3>动画</h3>
    <div class="box">
      <div class="square" [@square]="squareState" (click)="onChangeClick()">
    
      </div>
    </div>
    
    
      
    View Code
    md-grid-tile {
        background-color: skyblue;
    }
    
    .box {
        border-top: 1px solid red;
        border-bottom: 1px solid red;
    }
    
    hr {
        border: 2px solid green;
    }
    
    .square {
        height: 400px;
        width: 400px;
        background-color: skyblue;
    }
    CSS

      2.4 效果展示

        2.4.1 原始状态

          

        2.4.2 skyblue状态

          

        2..4.3 green状态

          

    3 animate方法高级用法

      animate方法除了支持暂停外还支持缓动函数和关键帧函数

      3.1 在animate方法中利用缓动函数

        技巧01:不是所有的缓动函数CSS都支持,而animations动画是基于CSS的,所以animations动画不支持所有的缓动函数

        

        代码解释:

          ease-in:表示从状态1变化到状态2是刚开始时比较慢然后比较快

          ease-out:表示从状态1变化到状态2刚开始时比较快然后比较慢

        技巧01:利用欢动函数来实现ease-in和ease-out的效果

          缓动函数速查表:点击前往

          

          自定义缓存函数:点击前往

           

      3.2 在animate方法中利用关键帧函数

        帧:动画中最小单位的单幅影响画面

        关键帧:物体运动或变化中的关键动作出所在的那一帧

        3.2.1 导入关键帧函数

          

        3.2.2 在animate方法中使用关键帧函数

          

    import { Component, OnInit } from '@angular/core';
    import { MdDialog, MD_DIALOG_DATA, MdDialogRef } from '@angular/material';
    import { Test02Component } from '../test02/test02.component';
    import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'
    
    import { trigger, state, transition, style, animate, keyframes} from '@angular/animations';
    
    @Component({
      selector: 'app-test',
      templateUrl: './test.component.html',
      styleUrls: ['./test.component.scss'],
      animations: [
        trigger(
          'square', [
            state('green', style({'background-color': 'green', 'transform': 'translateY(-100%)'})),
            state('skyblue', style({'background-color': 'skyblue', 'transform': 'translateY(100%)'})),
            transition('green => skyblue', animate('2s cubic-bezier(0.175, 0.885, 0.32, 1.275)')),
            // transition('skyblue => green', animate('2s cubic-bezier(.17,.74,.74,.17)')) 
            transition('skyblue => green', animate(1000, keyframes([
              style({'transform': 'translateY(100%)'}),
              style({'transform': 'translateY(90%)'}),
              style({'transform': 'translateY(80%)'}),
              style({'transform': 'translateY(70%)'}),
              style({'transform': 'translateY(60%)'}),
    
              style({'transform': 'translateY(-10%)'}),
              style({'transform': 'translateY(-20%)'}),
              style({'transform': 'translateY(-30%)'}),
              style({'transform': 'translateY(-40%)'}),
              style({'transform': 'translateY(-50%)'}),
              style({'transform': 'translateY(-60%)'}),
              style({'transform': 'translateY(-70%)'}),
              style({'transform': 'translateY(-70%)'}),
              style({'transform': 'translateY(-80%)'}),
              style({'transform': 'translateY(0)'}),
              
            ]))),
          ] 
        )
      ]
    })    
    export class TestComponent implements OnInit {
    
      color = "red";
    
      squareState: string;
    
      constructor(
        private dialog: MdDialog
      ) { }
    
      ngOnInit() {}
    
      onChangeClick() {
        this.squareState = this.squareState === 'skyblue' ? 'green' : 'skyblue';
      }
    
      openNewProjectDialog() {
        const dialogRef = this.dialog.open(Test02Component, {
          height: `400px`,
           '400px',
          data: `hello world`
        });
        dialogRef.afterClosed().subscribe(result => console.log(result));
      }  
    
      onClick(value: string) {
        alert(`你点击了 -> ${value}`);
      }
    
      onTest01() {
        this.dialog.open(ConfirmDialogComponent, {
          data: {
            title: '确认对话框',
            content:  '测试确认对话框的内容'
          }
        });
        alert('测试确认对话框');
      }
    
    }
    View Code
  • 相关阅读:
    图灵访谈之三十二:我的精神家园——陈皓专访
    对程序员职业的一些建议
    小波学习之一(单层一维离散小波变换DWT的Mallat算法C++和MATLAB实现)
    你是码农涅,还是创造者涅(内容是转载的,标题是我写的)
    小波学习之三(多孔算法与MATLAB swt剖析)—2013.5.27有更新
    【小波变换】STL版 一维离散小波变换(DWT)库,完全按matlab的wavelet toolbox 的API实现的
    从钱龙数据中读取股票权息信息导入到数据库
    从钱龙数据中读取股票交易数据(日线)导入到数据库
    从钱龙数据中读取股票代码信息导入到数据库
    汉典速查: 一个简易的国学阅读工具
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/8150573.html
Copyright © 2011-2022 走看看