如何在 Ionic 4 中添加标签动画?

Posted

技术标签:

【中文标题】如何在 Ionic 4 中添加标签动画?【英文标题】:How to add tab animation on change in Ionic 4? 【发布时间】:2019-06-27 13:16:42 【问题描述】:

我想在选项卡开关上添加向前和向后导航动画。

我想复制 Facebook 应用标签导航动画的当前状态。

我目前尝试在单个选项卡上添加一个方法来调用调用向前导航的函数。

<ion-tab-bar slot="bottom">
  <ion-tab-button (click)="goToListTab()" mode="md">
    <ion-icon name="list"></ion-icon>
    <ion-label>Orders</ion-label>
  </ion-tab-button>

  <ion-tab-button (click)="goToNewTab()" mode="md">
    <ion-icon name="add"></ion-icon>
    <ion-label>New Order</ion-label>
  </ion-tab-button>

  <ion-tab-button (click)="goToAccountTab()" mode="md">
    <ion-icon name="person"></ion-icon>
    <ion-label>Account</ion-label>
  </ion-tab-button>
</ion-tab-bar>

我的 .ts 文件具有调用导航的功能。为了简化,我只包括了一个。

goToAccountTab() 
    this.router.navigateBack('/tabs/account');

在 goToAccountTab 上,我希望它可以导航到带有 navigateBack 动画的帐户选项卡,但它成功地转到了帐户选项卡,但没有执行 navigateBack 动画。

【问题讨论】:

【参考方案1】:

使用 Ionic v4,我无法从选项卡控制器获取索引,但我通过保留选项卡的列表对象并以这种方式获取数字索引来解决此问题。

package.json

"@ionic/angular": "^4.9.1"
"@angular/core": "^8.2.7"
"com.telerik.plugins.nativepagetransitions": "^0.6.5",

Tabs.ts:

import  Component, OnInit, ViewChild  from '@angular/core';

import  IonTabs  from '@ionic/angular';

import 
  NativePageTransitions,
  NativeTransitionOptions,
 from '@ionic-native/native-page-transitions/ngx';


@Component(
  selector: 'app-tabs',
  templateUrl: 'tabs.page.html',
  styleUrls: ['tabs.page.scss']
)
export class TabsPage implements OnInit 

  @ViewChild('navTabs',  static: false ) navTabs: IonTabs;

  private tabs = 
    events: 0,
    notifications: 1,
    profile: 2
  ;
  loaded = false;
  tabIndex = 0;

  constructor(
    private nativePageTransitions: NativePageTransitions
  )  

  private getAnimationDirection(e: any): string 

    const currentIndex = this.tabIndex;
    this.tabIndex = this.tabs[e.tab];

    switch (true) 
      case currentIndex > this.tabs[e.tab]:
        return 'left';
      case currentIndex < this.tabs[e.tab]:
        return 'right';
    
  

  transition(e: any): void 

    const options: NativeTransitionOptions = 
      direction: this.getAnimationDirection(e),
      duration: 250,
      slowdownfactor: -1,
      slidePixels: 0,
      iosdelay: 20,
      androiddelay: 0,
      fixedPixelsTop: 0,
      fixedPixelsBottom: 48,
    ;

    if (!this.loaded) 
      this.loaded = true;
      return;
    

    this.nativePageTransitions.slide(options);
  


Tabs.html

<ion-tabs #navTabs (ionTabsWillChange)="transition($event)">

  <ion-tab-bar color="dark" slot="bottom">

    <ion-tab-button tab="events">
      <ion-icon name="calendar"></ion-icon>
      <ion-label>Events</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="notifications">
      <ion-icon name="notifications"></ion-icon>
      <ion-label>Notification</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="profile">
      <ion-icon name="barcode"></ion-icon>
      <ion-label>Profile</ion-label>
    </ion-tab-button>

  </ion-tab-bar>

</ion-tabs>

【讨论】:

【参考方案2】:

ionic 这样做的方式是使用 native page transitions 插件,即 no longer maintained 并且您遇到了我无法修复的错误(在制作动画时,您会看到两次页面)但这是我发现的最好的解决方案,因为 Ionic 没有正确地做到这一点(目前)。

所以,我把代码放在这里,它可能会有所帮助,也许你会找到解决办法;)

    运行
ionic cordova plugin add com.telerik.plugins.nativepagetransitions
npm install @ionic-native/native-page-transitions
    导入到 app.module.ts
import  NativePageTransitions  from '@ionic-native/native-page-transitions/ngx'

@NgModule(
  imports: [
    NativePageTransitions,
  ]

    在您的 tabs.page.ts 中添加动画逻辑
import 
  NativePageTransitions,
  NativeTransitionOptions,
 from '@ionic-native/native-page-transitions/ngx'

export class TabsPage 
loaded: boolean = false
tabIndex: number = 0

constructor(private nativePageTransitions: NativePageTransitions) 

  //Look the index to see which direction to go (if you have more than 3 tabs)
  private getAnimationDirection(e: any): string 
    var currentIndex = this.tabIndex

    this.tabIndex = e.index
    // or 
    // this.tabIndex = Object.keys(this.tabs).indexOf(e.tab)

    switch (true) 
      case currentIndex < e.index:
        return 'left'
      case currentIndex > e.index:
        return 'right'
    
  

  transition(e: any): void 
    let options: NativeTransitionOptions = 
      direction: this.getAnimationDirection(e),
      duration: 250,
      slowdownfactor: -1,
      slidePixels: 0,
      iosdelay: 20,
      androiddelay: 0,
      fixedPixelsTop: 0,
      fixedPixelsBottom: 48,
    

    if (!this.loaded) 
      this.loaded = true
      return
    

    this.nativePageTransitions.slide(options)
  

    在tabs.page.html里面
<ion-tabs (ionTabsWillChange)="transition($event)">
 /*...*/
</ion-tabs>

注意: 1. 对我来说,$event 给了我一个类似tab: 'home' 的对象,因为我正在通过一个标签数组创建带有循环的标签,所以我可以找到带有 Object.keys(tabs).indexOf($event.tab) 的索引 2.我也尝试过使用简单的角度路线动画,但是由于ionic将逻辑包装在ion-tabs中,它似乎不起作用

【讨论】:

以上是关于如何在 Ionic 4 中添加标签动画?的主要内容,如果未能解决你的问题,请参考以下文章

动画启动画面 - Ionic 4.0

如何在 Ionic 3 中禁用模态动画?

IONIC 4 - 如何在 HTML 中动态添加点击事件

如何在 IONIC 2 应用程序中添加选项卡

如何从 ionic 4 中的离子项目中删除白色背景?

如何将标签添加到 textField 类或动画占位符