docs: public void dynamicShow(DynamicConfig dynamicConfig) {
          if (null == dynamicConfig) return;
  
          boolean isReLayout = false;
          boolean isInvalidate = false;
  
          Float timeTextSize = dynamicConfig.getTimeTextSize();
          if (null != timeTextSize) {
              mCountdown.setTimeTextSize(timeTextSize);
              isReLayout = true;
          }
  
          Float suffixTextSize = dynamicConfig.getSuffixTextSize();
          if (null != suffixTextSize) {
              mCountdown.setSuffixTextSize(suffixTextSize);
              isReLayout = true;
          }
  
          Integer timeTextColor = dynamicConfig.getTimeTextColor();
          if (null != timeTextColor) {
              mCountdown.setTimeTextColor(timeTextColor);
              isInvalidate = true;
          }
  
          Integer suffixTextColor = dynamicConfig.getSuffixTextColor();
          if (null != suffixTextColor) {
              mCountdown.setSuffixTextColor(suffixTextColor);
              isInvalidate = true;
          }
  
          Boolean isTimeTextBold = dynamicConfig.isTimeTextBold();
          if (null != isTimeTextBold) {
              mCountdown.setTimeTextBold(isTimeTextBold);
              isReLayout = true;
          }
  
          Boolean isSuffixTimeTextBold = dynamicConfig.isSuffixTimeTextBold();
          if (null != isSuffixTimeTextBold) {
              mCountdown.setSuffixTextBold(isSuffixTimeTextBold);
              isReLayout = true;
          }
  
          // suffix text (all)
          String suffix = dynamicConfig.getSuffix();
          if (!TextUtils.isEmpty(suffix)) {
              mCountdown.setSuffix(suffix);
              isReLayout = true;
          }
  
          // suffix text
          String suffixDay = dynamicConfig.getSuffixDay();
          String suffixHour = dynamicConfig.getSuffixHour();
          String suffixMinute = dynamicConfig.getSuffixMinute();
          String suffixSecond = dynamicConfig.getSuffixSecond();
          String suffixMillisecond = dynamicConfig.getSuffixMillisecond();
          if (mCountdown.setSuffix(suffixDay, suffixHour, suffixMinute, suffixSecond, suffixMillisecond)) {
              isReLayout = true;
          }
  
          // suffix margin (all)
          Float suffixLRMargin = dynamicConfig.getSuffixLRMargin();
          if (null != suffixLRMargin) {
              mCountdown.setSuffixLRMargin(suffixLRMargin);
              isReLayout = true;
          }
  
          // suffix margin
          Float suffixDayLeftMargin = dynamicConfig.getSuffixDayLeftMargin();
          Float suffixDayRightMargin = dynamicConfig.getSuffixDayRightMargin();
          Float suffixHourLeftMargin = dynamicConfig.getSuffixHourLeftMargin();
          Float suffixHourRightMargin = dynamicConfig.getSuffixHourRightMargin();
          Float suffixMinuteLeftMargin = dynamicConfig.getSuffixMinuteLeftMargin();
          Float suffixMinuteRightMargin = dynamicConfig.getSuffixMinuteRightMargin();
          Float suffixSecondLeftMargin = dynamicConfig.getSuffixSecondLeftMargin();
          Float suffixSecondRightMargin = dynamicConfig.getSuffixSecondRightMargin();
          Float suffixMillisecondRightMargin = dynamicConfig.getSuffixMillisecondLeftMargin();
          if (mCountdown.setSuffixMargin(suffixDayLeftMargin, suffixDayRightMargin, suffixHourLeftMargin, suffixHourRightMargin,
                                         suffixMinuteLeftMargin, suffixMinuteRightMargin, suffixSecondLeftMargin, suffixSecondRightMargin, suffixMillisecondRightMargin)) {
              isReLayout = true;
          }
  
          Integer suffixGravity = dynamicConfig.getSuffixGravity();
          if (null != suffixGravity) {
              mCountdown.setSuffixGravity(suffixGravity);
              isReLayout = true;
          }
  
          // judgement time show
          Boolean tempIsShowDay = dynamicConfig.isShowDay();
          Boolean tempIsShowHour = dynamicConfig.isShowHour();
          Boolean tempIsShowMinute = dynamicConfig.isShowMinute();
          Boolean tempIsShowSecond = dynamicConfig.isShowSecond();
          Boolean tempIsShowMillisecond = dynamicConfig.isShowMillisecond();
          if (null != tempIsShowDay || null != tempIsShowHour || null != tempIsShowMinute || null != tempIsShowSecond || null != tempIsShowMillisecond) {
              boolean isShowDay = mCountdown.isShowDay;
              if (null != tempIsShowDay) {
                  isShowDay = tempIsShowDay;
                  mCountdown.mHasSetIsShowDay = true;
              } else {
                  mCountdown.mHasSetIsShowDay = false;
              }
              boolean isShowHour = mCountdown.isShowHour;
              if (null != tempIsShowHour) {
                  isShowHour = tempIsShowHour;
                  mCountdown.mHasSetIsShowHour = true;
              } else {
                  mCountdown.mHasSetIsShowHour = false;
              }
              boolean isShowMinute = null != tempIsShowMinute ? tempIsShowMinute : mCountdown.isShowMinute;
              boolean isShowSecond = null != tempIsShowSecond ? tempIsShowSecond : mCountdown.isShowSecond;
              boolean isShowMillisecond = null != tempIsShowMillisecond ? tempIsShowMillisecond : mCountdown.isShowMillisecond;
  
              boolean isModCountdownInterval = mCountdown.refTimeShow(isShowDay, isShowHour, isShowMinute, isShowSecond, isShowMillisecond);
  
              // judgement modify countdown interval
              if (isModCountdownInterval) {
                  start(mRemainTime);
              }
  
              isReLayout = true;
          }
  
          DynamicConfig.BackgroundInfo backgroundInfo = dynamicConfig.getBackgroundInfo();
          if (!isHideTimeBackground && null != backgroundInfo) {
              BackgroundCountdown backgroundCountdown = (BackgroundCountdown) mCountdown;
  
              Float size = backgroundInfo.getSize();
              if (null != size) {
                  backgroundCountdown.setTimeBgSize(size);
                  isReLayout = true;
              }
  
              Integer color = backgroundInfo.getColor();
              if (null != color) {
                  backgroundCountdown.setTimeBgColor(color);
                  isInvalidate = true;
              }
  
              Float radius = backgroundInfo.getRadius();
              if (null != radius) {
                  backgroundCountdown.setTimeBgRadius(radius);
                  isInvalidate = true;
              }
  
              Boolean isShowTimeBgDivisionLine = backgroundInfo.isShowTimeBgDivisionLine();
              if (null != isShowTimeBgDivisionLine) {
                  backgroundCountdown.setIsShowTimeBgDivisionLine(isShowTimeBgDivisionLine);
  
                  if (isShowTimeBgDivisionLine) {
                      Integer divisionLineColor = backgroundInfo.getDivisionLineColor();
                      if (null != divisionLineColor) {
                          backgroundCountdown.setTimeBgDivisionLineColor(divisionLineColor);
                      }
  
                      Float divisionLineSize = backgroundInfo.getDivisionLineSize();
                      if (null != divisionLineSize) {
                          backgroundCountdown.setTimeBgDivisionLineSize(divisionLineSize);
                      }
                  }
                  isInvalidate = true;
              }
  
              Boolean isShowTimeBgBorder = backgroundInfo.isShowTimeBgBorder();
              if (null != isShowTimeBgBorder) {
                  backgroundCountdown.setIsShowTimeBgBorder(isShowTimeBgBorder);
  
                  if (isShowTimeBgBorder) {
                      Integer borderColor = backgroundInfo.getBorderColor();
                      if (null != borderColor) {
                          backgroundCountdown.setTimeBgBorderColor(borderColor);
                      }
  
                      Float borderSize = backgroundInfo.getBorderSize();
                      if (null != borderSize) {
                          backgroundCountdown.setTimeBgBorderSize(borderSize);
                      }
  
                      Float borderRadius = backgroundInfo.getBorderRadius();
                      if (null != borderRadius) {
                          backgroundCountdown.setTimeBgBorderRadius(borderRadius);
                      }
                  }
                  isReLayout = true;
              }
          }
  
          Boolean tempIsConvertDaysToHours = dynamicConfig.isConvertDaysToHours();
          if (null != tempIsConvertDaysToHours && mCountdown.setConvertDaysToHours(tempIsConvertDaysToHours)) {
              reSetTime(getRemainTime());
              isReLayout = true;
          }
  
          if (isReLayout) {
              reLayout();
          } else if (isInvalidate) {
              invalidate();
          }
      }