/**
  * 设置弹幕滚动速度系数,只对滚动弹幕有效
  *
  * @param p
  * @return
  */
 public DanmakuGlobalConfig setScrollSpeedFactor(float p) {
   if (scrollSpeedFactor != p) {
     scrollSpeedFactor = p;
     DanmakuFactory.updateDurationFactor(p);
     GlobalFlagValues.updateMeasureFlag();
     GlobalFlagValues.updateVisibleFlag();
     notifyConfigureChanged(DanmakuConfigTag.SCROLL_SPEED_FACTOR, p);
   }
   return this;
 }
 public DanmakuGlobalConfig setScaleTextSize(float p) {
   if (scaleTextSize != p) {
     scaleTextSize = p;
     AndroidDisplayer.clearTextHeightCache();
     GlobalFlagValues.updateMeasureFlag();
     GlobalFlagValues.updateVisibleFlag();
     notifyConfigureChanged(DanmakuConfigTag.SCALE_TEXTSIZE, p);
   }
   isTextScaled = (scaleTextSize != 1f);
   return this;
 }
 @Override
 public void seek(long mills) {
   reset();
   //        requestClear();
   GlobalFlagValues.updateVisibleFlag();
   mStartRenderTime = mills < 1000 ? 0 : mills;
 }
 /**
  * 设置是否启用合并重复弹幕
  *
  * @param enable
  * @return
  */
 public DanmakuGlobalConfig setDuplicateMergingEnabled(boolean enable) {
   if (mDuplicateMergingEnable != enable) {
     mDuplicateMergingEnable = enable;
     GlobalFlagValues.updateFilterFlag();
     notifyConfigureChanged(DanmakuConfigTag.DUPLICATE_MERGING_ENABLED, enable);
   }
   return this;
 }
 /**
  * 添加屏蔽用户
  *
  * @param ids
  * @return
  */
 public DanmakuGlobalConfig addUserIdBlackList(Integer... ids) {
   if (ids == null || ids.length == 0) {
     return this;
   }
   Collections.addAll(mUserIdBlackList, ids);
   setFilterData(DanmakuFilters.TAG_USER_ID_FILTER, mUserIdBlackList);
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.USER_ID_BLACK_LIST, mUserIdBlackList);
   return this;
 }
 /**
  * 设置是否显示特殊弹幕
  *
  * @param visible
  */
 public DanmakuGlobalConfig setSpecialDanmakuVisibility(boolean visible) {
   setDanmakuVisible(visible, BaseDanmaku.TYPE_SPECIAL);
   setFilterData(DanmakuFilters.TAG_TYPE_DANMAKU_FILTER, mFilterTypes);
   GlobalFlagValues.updateFilterFlag();
   if (SecialDanmakuVisibility != visible) {
     SecialDanmakuVisibility = visible;
     notifyConfigureChanged(DanmakuConfigTag.SPECIAL_DANMAKU_VISIBILITY, visible);
   }
   return this;
 }
 /**
  * 添加屏蔽用户
  *
  * @param hashes
  * @return
  */
 public DanmakuGlobalConfig addUserHashBlackList(String... hashes) {
   if (hashes == null || hashes.length == 0) {
     return this;
   }
   Collections.addAll(mUserHashBlackList, hashes);
   setFilterData(DanmakuFilters.TAG_USER_HASH_FILTER, mUserHashBlackList);
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.USER_HASH_BLACK_LIST, mUserHashBlackList);
   return this;
 }
 /**
  * 设置防弹幕重叠
  *
  * @param pairs map<K,V> 设置null恢复默认设置,默认为允许重叠 K =
  *     (BaseDanmaku.TYPE_SCROLL_RL|BaseDanmaku.TYPE_SCROLL_LR|BaseDanmaku.TYPE_FIX_TOP|BaseDanmaku.TYPE_FIX_BOTTOM)
  *     V = true|false 是否重叠
  * @return
  */
 public DanmakuGlobalConfig preventOverlapping(Map<Integer, Boolean> pairs) {
   mIsPreventOverlappingEnabled = (pairs != null);
   if (pairs == null) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_OVERLAPPING_FILTER, false);
   } else {
     setFilterData(DanmakuFilters.TAG_OVERLAPPING_FILTER, pairs, false);
   }
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.OVERLAPPING_ENABLE, pairs);
   return this;
 }
 /**
  * 设置最大显示行数
  *
  * @param pairs map<K,V> 设置null取消行数限制 K =
  *     (BaseDanmaku.TYPE_SCROLL_RL|BaseDanmaku.TYPE_SCROLL_LR|BaseDanmaku.TYPE_FIX_TOP|BaseDanmaku.TYPE_FIX_BOTTOM)
  *     V = 最大行数
  * @return
  */
 public DanmakuGlobalConfig setMaximumLines(Map<Integer, Integer> pairs) {
   mIsMaxLinesLimited = (pairs != null);
   if (pairs == null) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_MAXIMUN_LINES_FILTER, false);
   } else {
     setFilterData(DanmakuFilters.TAG_MAXIMUN_LINES_FILTER, pairs, false);
   }
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.MAXIMUN_LINES, pairs);
   return this;
 }
 /**
  * 设置色彩过滤弹幕白名单
  *
  * @param colors
  * @return
  */
 public DanmakuGlobalConfig setColorValueWhiteList(Integer... colors) {
   mColorValueWhiteList.clear();
   if (colors == null || colors.length == 0) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_TEXT_COLOR_DANMAKU_FILTER);
   } else {
     Collections.addAll(mColorValueWhiteList, colors);
     setFilterData(DanmakuFilters.TAG_TEXT_COLOR_DANMAKU_FILTER, mColorValueWhiteList);
   }
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.COLOR_VALUE_WHITE_LIST, mColorValueWhiteList);
   return this;
 }
 /**
  * 设置屏蔽弹幕用户hash
  *
  * @param hashes
  * @return
  */
 public DanmakuGlobalConfig setUserHashBlackList(String... hashes) {
   mUserHashBlackList.clear();
   if (hashes == null || hashes.length == 0) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_USER_HASH_FILTER);
   } else {
     Collections.addAll(mUserHashBlackList, hashes);
     setFilterData(DanmakuFilters.TAG_USER_HASH_FILTER, mUserHashBlackList);
   }
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.USER_HASH_BLACK_LIST, mUserHashBlackList);
   return this;
 }
 public DanmakuGlobalConfig removeUserIdBlackList(Integer... ids) {
   if (ids == null || ids.length == 0) {
     return this;
   }
   for (Integer id : ids) {
     mUserIdBlackList.remove(id);
   }
   setFilterData(DanmakuFilters.TAG_USER_ID_FILTER, mUserIdBlackList);
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.USER_ID_BLACK_LIST, mUserIdBlackList);
   return this;
 }
 /**
  * 设置屏蔽弹幕用户id , 0 表示游客弹幕
  *
  * @param ids
  * @return
  */
 public DanmakuGlobalConfig setUserIdBlackList(Integer... ids) {
   mUserIdBlackList.clear();
   if (ids == null || ids.length == 0) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_USER_ID_FILTER);
   } else {
     Collections.addAll(mUserIdBlackList, ids);
     setFilterData(DanmakuFilters.TAG_USER_ID_FILTER, mUserIdBlackList);
   }
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.USER_ID_BLACK_LIST, mUserIdBlackList);
   return this;
 }
 public DanmakuGlobalConfig removeUserHashBlackList(String... hashes) {
   if (hashes == null || hashes.length == 0) {
     return this;
   }
   for (String hash : hashes) {
     mUserHashBlackList.remove(hash);
   }
   setFilterData(DanmakuFilters.TAG_USER_HASH_FILTER, mUserHashBlackList);
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.USER_HASH_BLACK_LIST, mUserHashBlackList);
   return this;
 }
 /**
  * 设置是否屏蔽游客弹幕
  *
  * @param block true屏蔽,false不屏蔽
  * @return
  */
 public DanmakuGlobalConfig blockGuestDanmaku(boolean block) {
   if (mBlockGuestDanmaku != block) {
     mBlockGuestDanmaku = block;
     if (block) {
       setFilterData(DanmakuFilters.TAG_GUEST_FILTER, block);
     } else {
       DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_GUEST_FILTER);
     }
     GlobalFlagValues.updateFilterFlag();
     notifyConfigureChanged(DanmakuConfigTag.BLOCK_GUEST_DANMAKU, block);
   }
   return this;
 }
 /**
  * 设置同屏弹幕密度 -1自动 0无限制
  *
  * @param maxSize
  * @return
  */
 public DanmakuGlobalConfig setMaximumVisibleSizeInScreen(int maxSize) {
   maximumNumsInScreen = maxSize;
   // 无限制
   if (maxSize == 0) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_QUANTITY_DANMAKU_FILTER);
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_ELAPSED_TIME_FILTER);
     notifyConfigureChanged(DanmakuConfigTag.MAXIMUM_NUMS_IN_SCREEN, maxSize);
     return this;
   }
   // 自动调整
   if (maxSize == -1) {
     DanmakuFilters.getDefault().unregisterFilter(DanmakuFilters.TAG_QUANTITY_DANMAKU_FILTER);
     DanmakuFilters.getDefault().registerFilter(DanmakuFilters.TAG_ELAPSED_TIME_FILTER);
     notifyConfigureChanged(DanmakuConfigTag.MAXIMUM_NUMS_IN_SCREEN, maxSize);
     return this;
   }
   setFilterData(DanmakuFilters.TAG_QUANTITY_DANMAKU_FILTER, maxSize);
   GlobalFlagValues.updateFilterFlag();
   notifyConfigureChanged(DanmakuConfigTag.MAXIMUM_NUMS_IN_SCREEN, maxSize);
   return this;
 }
 protected void loadDanmakus(BaseDanmakuParser parser) {
   danmakuList = parser.setDisplayer(mDisp).setTimer(mTimer).getDanmakus();
   GlobalFlagValues.resetAll();
 }
 @Override
 public void clearDanmakusOnScreen(long currMillis) {
   reset();
   GlobalFlagValues.updateVisibleFlag();
   mStartRenderTime = currMillis;
 }