Flutter圈子imuzi的Flutter学习记录Flutter中文社区

Flutter学习记录-微信群聊九宫格头像

2018-12-29  本文已影响33人  imuzi
1.png
class AppDimens {
  static const ChatItemImageDimens = 44.0;

  static const ChatItemGroupIconPaddingDimes = 2.0;
  static const ChatItemGroupChildIconMarginDimes = 2.0;
}

var row = 0, column = 0;

// 群聊九宫格头像
class WeChatGroupChatIcon extends StatelessWidget {
  WeChatGroupChatIcon({Key key, @required this.avatars})
      : assert(avatars != null),
        super(key: key);
  final List<String> avatars;

  @override
  Widget build(BuildContext context) {
    var childCount = avatars.length;
    var columnMax;
    List<Widget> icons = [];
    List<Widget> stacks = [];
    // 五张图片之后(包含5张),每行的最大列数是3
    var imgWidth;

    if (childCount < 2) {
      return Container(
        width: AppDimens.ChatItemImageDimens,
        height: AppDimens.ChatItemImageDimens,
        color: Color(AppColors.DiverColor),
      );
    }

    if (childCount >= 5) {
      columnMax = 3;
      imgWidth = (AppDimens.ChatItemImageDimens -
              (AppDimens.ChatItemGroupIconPaddingDimes * columnMax) -
              AppDimens.ChatItemGroupChildIconMarginDimes) /
          columnMax;
    } else {
      columnMax = 2;
      imgWidth = (AppDimens.ChatItemImageDimens -
              (AppDimens.ChatItemGroupIconPaddingDimes * columnMax) -
              AppDimens.ChatItemGroupChildIconMarginDimes) /
          columnMax;
    }
    for (var i = 0; i < childCount; i++) {
      icons.add(_weChatGroupChatChildIcon(avatars[i], imgWidth));
    }
    row = 0;
    column = 0;
    var centerTop = 0.0;
    if (childCount == 2 || childCount == 5 || childCount == 6) {
      centerTop = imgWidth / 2;
    }
    for (var i = 0; i < childCount; i++) {
      var left =
          imgWidth * row + AppDimens.ChatItemGroupIconPaddingDimes * (row + 1);
      var top = imgWidth * column +
          AppDimens.ChatItemGroupIconPaddingDimes * column +
          centerTop;
      switch (childCount) {
        case 3:
        case 7:
          _topOneIcon(stacks, icons[i], childCount, i, imgWidth, left, top);
          break;
        case 5:
        case 8:
          _topTwoIcon(stacks, icons[i], childCount, i, imgWidth, left, top);
          break;
        default:
          _otherIcon(
              stacks, icons[i], childCount, i, imgWidth, left, top, columnMax);
          break;
      }
    }
    return Container(
      width: AppDimens.ChatItemImageDimens,
      height: AppDimens.ChatItemImageDimens,
      color: Color(AppColors.DiverColor),
      padding: EdgeInsets.only(
        top: AppDimens.ChatItemGroupIconPaddingDimes,
      ),
      alignment: AlignmentDirectional.bottomCenter,
      child: Stack(
        children: stacks,
      ),
    );
  }
}

_weChatGroupChatChildIcon(String avatar, double width) {
  return Image.network(
    avatar,
    height: width,
    width: width,
    fit: BoxFit.fill,
  );
}

// 顶部为一张图片
_topOneIcon(
    List<Widget> stacks, Widget child, int childCount, i, imgWidth, left, top) {
  if (i == 0) {
    var firstLeft =
        imgWidth / 2 + left + AppDimens.ChatItemGroupChildIconMarginDimes / 2;
    if (childCount == 7) {
      firstLeft = imgWidth + left + AppDimens.ChatItemGroupChildIconMarginDimes;
    }
    stacks.add(Positioned(
      child: child,
      left: firstLeft,
    ));
    row = 0;
    // 换行
    column++;
  } else {
    stacks.add(Positioned(
      child: child,
      left: left,
      top: top,
    ));
    // 换列
    row++;
    if (i == 3) {
      // 第一例
      row = 0;
      // 换行
      column++;
    }
  }
}

// 顶部为两张图片
_topTwoIcon(
    List<Widget> stacks, Widget child, int childCount, i, imgWidth, left, top) {
  if (i == 0 || i == 1) {
    stacks.add(Positioned(
      child: child,
      left:
          imgWidth / 2 + left + AppDimens.ChatItemGroupChildIconMarginDimes / 2,
      top: childCount == 5 ? top : 0.0,
    ));
    row++;
    if (i == 1) {
      row = 0;
      // 换行
      column++;
    }
  } else {
    stacks.add(Positioned(
      child: child,
      left: left,
      top: top,
    ));
    // 换列
    row++;
    if (i == 4) {
      // 第一例
      row = 0;
      // 换行
      column++;
    }
  }
}

_otherIcon(List<Widget> stacks, Widget child, int childCount, i, imgWidth, left,
    top, columnMax) {
  stacks.add(Positioned(
    child: child,
    left: left,
    top: top,
  ));
  // 换列
  row++;
  if ((i + 1) % columnMax == 0) {
    // 第一例
    row = 0;
    // 换行
    column++;
  }
}
上一篇下一篇

猜你喜欢

热点阅读