Flutter伪微信-003-自定义导航栏图标

266 阅读3分钟

前言

目前微信的导航栏图标使用的是Flutter框架自带的字体图标,不太好看。

所以使用阿里巴巴矢量库找到了一些符合、贴近原生微信的图标,替换掉导航栏图标。

想法

  • 自定义字体图标类。
  • 导航栏使用自定义的图标。

实现

下载字体文件

在阿里巴巴矢量库中找到合适的图标,加入购物车,在购物车中下载代码,拷贝xxx.ttfxxx.json文件到项目中。

image.png

修改项目配置

修改项目根目录下的pubspec.yaml配置文件加入以下代码

flutter:
  fonts:
    - family: WeChatFont
      fonts:
        - asset: fonts/wechat-iconfont.ttf

自定义图标类

IconData的构造函数如下

const IconData(
  this.codePoint, {
  this.fontFamily,
  this.fontPackage,
  this.matchTextDirection = false,
}

其中常用的属性为:

  • codePoint: 字体图标Unicode编码
  • fontFamily: 字体名称(自定义,只要和配置文件保持一致就行)
  • fontPackage: 字体包的名称
  • matchTextDirection: 是否应在从右到左的环境中自动镜像此图标

lib目录下新建ui/font.dart文件

IconData( codePoint(xxx.json中的unicode), fontFamily: fontFamily)
  • fontFamily 配置文件中的值

import 'package:flutter/material.dart';

class WeChatFont {
  static const fontFamily = "WeChatFont";

  ///添加用户
  static const IconData add_user = IconData(0xf014d, fontFamily: fontFamily);
  ///语音
  static const IconData speech = IconData(0xe805, fontFamily: fontFamily,);
  ///语音
  static const IconData speech_2 = IconData(0xe888, fontFamily: fontFamily);
  ///
  static const IconData my = IconData(0xe608, fontFamily: fontFamily);
  ///消息
  static const IconData message = IconData(0xe642, fontFamily: fontFamily);
  ///消息
  static const IconData message_2 = IconData(0xe619, fontFamily: fontFamily);
  ///公众号
  static const IconData official_accounts = IconData(0xe68b, fontFamily: fontFamily);
  ///位置
  static const IconData address = IconData(0xe8ff, fontFamily: fontFamily);
  ///视频
  static const IconData video = IconData(0xe603, fontFamily: fontFamily);
  ///群聊
  static const IconData group_chat = IconData(0xe60f, fontFamily: fontFamily);
  ///设置
  static const IconData setting = IconData(0xeb8d, fontFamily: fontFamily);
  ///标签
  static const IconData label = IconData(0xeabd, fontFamily: fontFamily);
  ///图片
  static const IconData picture = IconData(0xeac4, fontFamily: fontFamily);
  ///搜一搜
  static const IconData search = IconData(0xe611, fontFamily: fontFamily);
  ///服务
  static const IconData server = IconData(0xe732, fontFamily: fontFamily);
  ///音乐
  static const IconData music = IconData(0xe667, fontFamily: fontFamily);
  ///扫一扫
  static const IconData sweep = IconData(0xe62c, fontFamily: fontFamily);
  ///发现
  static const IconData discover = IconData(0xe655, fontFamily: fontFamily);
  ///表情
  static const IconData expression = IconData(0xe612, fontFamily: fontFamily);
  ///添加
  static const IconData add = IconData(0xe641, fontFamily: fontFamily);
  ///朋友圈
  static const IconData friend_circle = IconData(0xe603, fontFamily: fontFamily);
  ///附近
  static const IconData nearby = IconData(0xebfa, fontFamily: fontFamily);
  ///通讯录
  static const IconData directory = IconData(0xe604, fontFamily: fontFamily);
  ///相机
  static const IconData camera = IconData(0xe63e, fontFamily: fontFamily);
  ///转账
  static const IconData transfer = IconData(0xe606, fontFamily: fontFamily);
  ///收藏
  static const IconData collection = IconData(0xea5a, fontFamily: fontFamily);
  ///卡包
  static const IconData card_package = IconData(0xe603, fontFamily: fontFamily);
  ///文件
  static const IconData file = IconData(0xe69e, fontFamily: fontFamily);
  ///收付款
  static const IconData payment_received = IconData(0xe647, fontFamily: fontFamily);

}

修改导航栏图标

找到lib/pages/index/index.dart文件,修改导航栏图标

// 定义图标Map(方便后期使用自定义图标库)
final Map<String, Icon> _iconMap = const {
  "message": Icon(WeChatFont.message),
  "directory": Icon(WeChatFont.directory),
  "discover": Icon(WeChatFont.discover),
  "home": Icon(WeChatFont.my),
};

设置导航栏选择、未选择状态下的图标颜色和文字大小

BottomNavigationBar(
  //设置选中图标颜色
  selectedItemColor: Colors.green,
  //设置未选中图标颜色
  unselectedItemColor: Colors.grey,
  //设置选中文字大小
  selectedLabelStyle: const TextStyle(fontSize: 10),
  //设置未选中文字大小
  unselectedLabelStyle: const TextStyle(fontSize: 10),
  //设置类型
  type: BottomNavigationBarType.fixed,
  //设置选中下标
  currentIndex: _index,
  //设置按钮按下事件
  onTap: _onBottomNavigationBarTapped,
  //调用构建导航栏组件方法
  items: _getNavBarItem(),
)

预览

image.png

项目链接

github.com/BadKid90s/p…